Подтвердить что ты не робот

Как определить определение в командной строке с помощью gcc

Как мне во время компиляции отменить макрос компилятора с помощью gcc. Я попытался скомпилировать аргументы gcc как -D, но я не могу увидеть сообщение "не определено".

Спасибо

#include <iostream>

#define MYDEF


int main(){
#ifdef MYDEF
  std::cout<<"defined\n";
#else
  std::cout<<"not defined\n";
#endif

}
4b9b3361

Ответ 1

Вы можете использовать опцию -U с gcc, но она не будет определять неопределенный макрос, определенный в вашем исходном коде. Насколько я знаю, нет никакого способа сделать это.

Ответ 2

Вы должны обернуть определение MYDEF в макросе препроцессора, наличие которого (определенное в командной строке) предотвратит определение MYDEF. Немного свернуто, чтобы быть уверенным, но затем вы можете управлять сборкой так, как вы хотите, из командной строки (или Makefile). Пример:

#ifndef DONT_DEFINE_MYDEF
#define MYDEF
#endif

Затем из командной строки, когда вы не хотите MYDEF:

gcc -DDONT_DEFINE_MYDEF ...

Ответ 3

http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Preprocessor-Options.html#Preprocessor-Options

Параметры -U выглядели как то, что вам могло понадобиться... но затем вы не можете переопределить определение, содержащееся в вашем исходном коде, не прибегая к более препроцессорным директивам.

Ответ 4

Случай использования кода неверен. Как я вижу, у вас есть жесткий код #define в файле. Если компилятор изначально предполагает MYDEF undefined, он определит его после начала обработки файла.

Вы должны удалить строку #define MYDEF. И я надеюсь, что ваш тестовый пример будет работать, если вы пройдете MYDEF до -D и -U.

Ответ 5

Вы можете прибегнуть к фильтрации исходного кода и вернуть его в gcc для компиляции, например, этот псевдокод:

grep -v "define MYDEF" yourFile.c | gcc -o yourFile.o -xc -

Надеюсь, что это поможет.

Ответ 6

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

Если ваш MYDEF был #defined в отдельном файле заголовка #, включенном в .c файл, вы могли бы заставить определение макроса #include охраны с опцией -D (таким образом, предотвращая MYDEF #definition) затем либо активно #define (все еще с опцией -D) MYDEF к чему-то другому, либо просто оставьте его undefined.

Понятно, что все, что было определено в файле заголовка, также было бы отсутствовать, но это было для меня решением принудительно деинсталлировать макрос без изменения стороннего кода.