2016-11-25 2 views
-3

Я тестирую две версии одного и того же кода (с GCC версии 4.9.2 на Linux, без параметров).GCC требует подчеркивания в # define's?

У обоих есть директива #define, а затем пара #ifdef/#endif далее вниз.

Теперь выясняется, что комбинация работает правильно, только если метка после начального #define начинается с подчеркивания. Без подчеркивания это работает ... очень странным образом, только каждый третий раз.

Другими словами, это работает

#define _whatever 

в то время как это не делает:

#define whatever 

Даже если я знаю, как сделать работу директивы, просто интересно - это такое поведение следовать любому стандарту ?

Редактировать: Ниже приведены нижеприведенные нижеприведенные примеры. Это одна распечатывает линия «Препроцессор работает»:

#define _whatever 
#include <stdio.h> 
void main() 
{ 
#ifdef _whatever 
printf("Preprocessor works \n"); 
#endif 
} 

... и это один не выдает ничего:

#define whatever 
#include <stdio.h> 
void main() 
{ 
#ifdef whatever 
printf("Preprocessor works \n"); 
#endif 
} 

Да, я даже используя слово «все» в буквальном смысле - Я не думаю, что это определено где-то еще. Но опять же, это подчеркивание, которое заставляет ярлык работать.

+1

Вы не показываете, какая часть кода работает или перестает работать. –

+2

Пожалуйста, предоставьте [mcve]. – user694733

+0

Хорошо, реальные примеры: – vanhemt

ответ

0

В любой известной версии gcc нет необходимости в том, чтобы макросы препроцессора начинались с символа подчеркивания.

Как правило, макросы препроцессора, которые начинаются с различных комбинаций подчеркиваний, зарезервированы для реализации, и пользователям рекомендуется игнорировать их. Так что #define whatever и #ifdef whatever абсолютно должны работать.

Я согласен с тем, что это сложная и неприятная проблема. Там что-то странное происходит, но независимо от объяснения, это не то, что gcc требует ведущих подчеркиваний.

-1

Хорошо, так что ответ - моя неряшливая команда инструментов.

В частности:

(1) Я использовал заголовочный файл для добавления/удаления директиве #define

(2) Я (бездумно) составлен заголовок с помощью "GCC *" вместо «gcc * .c»

(3) Случайное присутствие скомпилированного файла * .h.gch объясняет результаты.

Итак, казалось, что беспорядочное поведение было на самом деле мной (бездумно), время от времени удаляя * .h.gch.

Спасибо всем - Я многое узнал из всех ответов.

Смежные вопросы