2015-05-19 3 views
3

Предположим, что я прохожу макроса DEFS через -D во время компиляции:проверить значение макроса во время выполнения

% gcc -DDEF1=ABC -DDEF2=DEF ... 

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

#if DEF1==ABC 
... 
#else 
... 
#endif 

Что я делаю неправильно? Можно ли добиться того, что мне нужно? Спасибо.

+0

возможно дубликат [сравнение строк в условиях препроцессора в C] (http://stackoverflow.com/questions/18278868/string-comparison-in-preprocessor-conditions-in-c) – hugomg

ответ

4

Теперь мне нужно проверить значение DEF1 или DEF2 в режиме исполнения,

Это не представляется возможным. Значения макросов препроцессора обрабатываются еще до момента компиляции.

Вы можете преобразовать макросы процессора в значения переменных и проверить значения переменных во время выполнения.

Что-то в следующих строках должно работать.

#define STR2(x) #x 
#define STR(X) STR2(X) 

char const* str = STR(DEF1); 

if (strcmp(str, "ABC") == 0) 
{ 
    // Process "ABC" 
} 
else if strcmp(str, "DEF") == 0) 
{ 
    // Process "DEF" 
} 
2

Вы имеете в виду во время компиляции, нет? Время выполнения if - это без знака хеширования.

Выражения макроса для #if оцениваются как целые числа и неопределенные макросы, молча по умолчанию равные нулю.

Я не уверен, что вы хотите достичь, но если значения макросов определены в источнике, прежде чем перейти на них с #if, вы можете сделать что-то вроде этого:

#define APPLE 1 
#define ORANGE 2 
#define PEAR 3 

#if FRUIT==APPLE 
    const char *fname = "Apple"; 
#elif FRUIT==PEAR 
    const char *fname = "Pear"; 
#elif FRUIT==ORANGE 
    const char *fname = "Orange"; 
#else 
    #error "Must specify a valid FRUIT" 
#endif 

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

2

Макрос расширяется препроцессором обычным исходным кодом C, а затем используется так же. Например, если у вас есть макрос , который должен быть #define d для номера, вы можете проверить его значение во время выполнения, как и с любым другим номером.

if (MY_NUMBER == 42) 
    printf("MY_NUMBER is 42\n"); 
else 
    printf("MY_NUMBER is not 42 but rather %d\n", MY_NUMBER); 

Однако, если ваш макрос раскрывается в неприятные вещи, и вы хотели бы, чтобы проверить, что текст, вы должны преобразовать макрос в строку, а затем посмотреть на эту строку. Например:

if (strcmp(STRINGIZE(MY_MACRO), "for (;;)") == 0) 
    printf("MY_MACRO was #define'd to an infinite loop."); 

Обычный трюк для «строгания» макроса выглядит так, если вы его раньше не видели.

#define STRINGIZE_R(X) #X 
#define STRINGIZE(X) STRINGIZE_R(X) 
Смежные вопросы