Ответ 1
Вы можете использовать опцию -U с gcc, но она не будет определять неопределенный макрос, определенный в вашем исходном коде. Насколько я знаю, нет никакого способа сделать это.
Как мне во время компиляции отменить макрос компилятора с помощью gcc. Я попытался скомпилировать аргументы gcc как -D, но я не могу увидеть сообщение "не определено".
Спасибо
#include <iostream>
#define MYDEF
int main(){
#ifdef MYDEF
std::cout<<"defined\n";
#else
std::cout<<"not defined\n";
#endif
}
Вы можете использовать опцию -U с gcc, но она не будет определять неопределенный макрос, определенный в вашем исходном коде. Насколько я знаю, нет никакого способа сделать это.
Вы должны обернуть определение MYDEF
в макросе препроцессора, наличие которого (определенное в командной строке) предотвратит определение MYDEF. Немного свернуто, чтобы быть уверенным, но затем вы можете управлять сборкой так, как вы хотите, из командной строки (или Makefile). Пример:
#ifndef DONT_DEFINE_MYDEF
#define MYDEF
#endif
Затем из командной строки, когда вы не хотите MYDEF:
gcc -DDONT_DEFINE_MYDEF ...
http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Preprocessor-Options.html#Preprocessor-Options
Параметры -U
выглядели как то, что вам могло понадобиться... но затем вы не можете переопределить определение, содержащееся в вашем исходном коде, не прибегая к более препроцессорным директивам.
Случай использования кода неверен. Как я вижу, у вас есть жесткий код #define
в файле. Если компилятор изначально предполагает MYDEF
undefined, он определит его после начала обработки файла.
Вы должны удалить строку #define MYDEF
. И я надеюсь, что ваш тестовый пример будет работать, если вы пройдете MYDEF
до -D
и -U
.
Вы можете прибегнуть к фильтрации исходного кода и вернуть его в gcc для компиляции, например, этот псевдокод:
grep -v "define MYDEF" yourFile.c | gcc -o yourFile.o -xc -
Надеюсь, что это поможет.
Вот одна из возможностей, которая не полностью охватывает ваш случай использования, но который, как мне показалось, полезен в моем случае.
Если ваш MYDEF
был #defined в отдельном файле заголовка #, включенном в .c файл, вы могли бы заставить определение макроса #include охраны с опцией -D
(таким образом, предотвращая MYDEF
#definition) затем либо активно #define (все еще с опцией -D
) MYDEF
к чему-то другому, либо просто оставьте его undefined.
Понятно, что все, что было определено в файле заголовка, также было бы отсутствовать, но это было для меня решением принудительно деинсталлировать макрос без изменения стороннего кода.