#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.com2. Кроме того, какой режим вы используете?
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 бита.