2016-11-26 4 views
0

Я компиляция моего кода игры двигателя на VS2015 и Xcode с помощью GCC
Я использовал много компиляторов для моего кода и только GCC показывает предупреждение:. «Предупреждение: отсутствует завершающий» символ»в ложном состоянии

warning : missing terminating " character 

кода, как следующее:

#if 1 
    ... 
#else 
    asm __volatile__(" 
    some assembly code 
    ... 
    ":::); 
#endif 

Я знаю недавняя НКА не принимает новые строки в строке, но я не знаю, почему НКУ препроцессор извергает предупреждение для ложного блока
Я знаю, что мой Wr. iting стиль встроенной сборки старый, но они находятся в ложном условном блоке. Я не хочу трогать их, потому что их так много.
Как я могу избежать этого предупреждения в ложном условном блоке, кроме предупреждения всех предупреждений?

Редактировать:
Я скомпилировал свой код с помощью Armcc, VC++ (2005,2008,2012,2013,2015) и clang. Они не показывают такого предупреждения, только GCC.
Если предупреждения для кода в условном блоке TRUE, я исправлю их. Но это предупреждения для условных блоков FALSE, которые не должны оцениваться.

+0

Вы видели это [ответ] (http://stackoverflow.com/a/10205777/5588347)? –

+2

Возможный дубликат [странное сообщение об ошибке для встроенной сборки GCC] (http://stackoverflow.com/questions/10205691/strange-error-message-about-gcc-inline-assembly) – Carpetsmoker

+0

@Carpetsmoker: вопрос не о " отсутствующий конец символа "(OP отлично знает, что он отсутствует), а скорее о том, почему это происходит в, казалось бы, * отключенном * расширении кода. – AnT

ответ

0

C препроцессор строка-буквально. За языковой грамматики, строковый литерал является одним из предобработки лексем

preprocessing-token: 
    header-name 
    identifier 
    pp-number 
    character-constant 
    string-literal 
    punctuator 
    each non-white-space character that cannot be one of the above 

Это, конечно, совершенно ожидаемым, так как в противном случае препроцессор не сможет сказать MACRO_NAME из "MACRO_NAME" (последний просто строка).

По этой причине ваши строковые литералы должны быть отформатированы правильно для целей предварительной обработки. Я предполагаю, что GCC видит первый " и начинает интерпретировать последовательность как строковый литерал, но затем отказывается от попытки (из-за отсутствия завершающего ") и записывает ее под общей категорией «не может быть одной из вышеуказанных», сопровождающей ее предупреждение,

Вы, кажется, считаете, что условное включение работает на более высоком уровне предварительной обработки, чем распознавание таких токенов как строковых литералов. Это предположение неверно. Препроцессор не имеет другого выбора, кроме как разобрать «отключенный» участок кода.

+0

Благодарим вас за подробное объяснение. Мой вопрос, почему только gcc показывает это предупреждение, а другие нет. Я пытаюсь удалить предупреждения как можно больше, и я хотел удалить этот waring. Но если я не могу, я оставлю предупреждение как есть. – yhorimoto

+0

@yhorimoto: Предупреждения являются ненормативными. GCC решил, что он заслуживает предупреждения, в то время как Clang (для другого примера) этого не делает. – AnT