2013-08-28 2 views
5

Я хотел бы переопределить макрос из командной строки. Где-то в моем источнике, есть определение, как это:Переопределить макрос из командной строки

#define MY_FOO 1 

То, что я хотел бы, чтобы установить значение этого макроса, когда я скомпилировать свою программу:

g++ -DMY_FOO=2 ... 

Но тогда, макрос переопределен исходным кодом его старое значение 1. Проблема в том, что я не являюсь частью источника, который определяет макрос в первую очередь. Если бы это был мой собственный код, я мог бы просто написать

#ifndef MY_FOO 
#define MY_FOO 1 
#endif 

И моя проблема исчезла бы. Так можно указать макрос в командной строке с помощью g ++, чтобы исходный код не мог его переопределить?

+1

Почему вы хотите это сделать? Может быть, есть другой способ, если вы скажете нам реальную проблему. – doctorlove

+3

Нужно ли вам это определение в самом файле заголовка, или оно будет работать просто «# undef» после вашего '# include'? – svk

+0

Реальная проблема заключается в том, что я работаю над проектом, в котором уровень отладки нескольких выходных потоков задается с помощью config.h, который, в свою очередь, генерируется autotools. Но я хочу только собрать одну простую тестовую программу в моем пакете с более высоким уровнем отладки, и я не хочу перенастраивать весь пакет, потому что это занимает довольно много времени. – Sh4pe

ответ

7

Вы не можете.

Командная строка обрабатывается перед любыми исходными и заголовочными файлами.
Если исходный файл определяет макрос, то он не должен быть определен ранее и будет получать новое значение с этого момента.
Единственный способ изменить это, это #undef и #define это снова, в более поздней точке. Если у вас есть доступ к заголовку, который включен после определения, у вас есть шанс.

0

Если вы пытаетесь сделать что-то, что можно настроить из командной строки, и вы можете изменить исходный код, то вы можете использовать #ifndef для определения макроса, только если он еще не определен. Поэтому, когда вы определяете макрос, код будет видеть его и не перезаписывать, но если вы его не определите, он будет иметь значение по умолчанию.

0

Если файл config.h предотвращает множественные включения (через #ifndef CONFIG_H и т.д.), то вы могли бы злоупотреблять, что:

g++ -DMY_FOO=2 -DCONFIG_H 

Примечание: Если файл config.h содержит что-нибудь еще, что вам нужно, то вы также должны сами определить себя. Вы можете сделать копию файла как my_config.h и включить его. (См. Также опцию препроцессора -include file).

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