Препроцессор C для создания строковых литералов

#c #c-preprocessor

#c #c-препроцессор

Вопрос:

Мне нужно сделать что-то вроде:

 #define charSz 16

#if charSz == 8
    typedef char8_t Char;
    #define STR(s) #s
#elif charSz == 16
    typedef char16_t Char;
    #define STR(s) u ## #s
#elif charSz == 32
    typedef char32_t Char;
    #define STR(s) U ## #s
#endif 

#include <string>
typedef std::basic_string< Char > String;

int main(){

  String s=STR(nice) ;
  String t=STR(very nice) ;
  String u=STR(good) ;

  return 0;

}
  

но проблемы с препроцессором

распределитель.cpp:24:21: ошибка: вставка «u» и «»good»» не дает допустимого токена предварительной обработки

Комментарии:

1. Какую версию gcc или clang вы используете? Работает для меня на coliru.stacked-crooked.com

2. Кроме того, какой режим вы используете? u"" строковые литералы являются новыми в C 11, поэтому, естественно, код не будет работать в режиме C 03.

3. Похоже, вы компилируете с g без предоставления -std=c 11 опции.

4. @MattClarkson Используемая версия: g (Ubuntu 4.8.2-19ubuntu1) 4.8.2

5. @Джозефмансфилд . Я скомпилировал с помощью -std=c 11, и все прошло нормально!

Ответ №1:

Эти u"" / U"" строковые литералы относятся только к C 11 и более поздним версиям и не поддерживаются в более старых версиях C .

Если ваш компилятор поддерживает C 11 и ваш проект позволяет его использовать, тогда включите компиляцию C 11 (например, g и clang с помощью -std=c 11 переключателя).

В противном случае вам не повезло. Более старый L"" не является подходящей заменой строкам UTF-16, и вообще не существует строковых литералов шириной 32 бита.