Как перехватить неопределенный макрос в условии препроцессора #if? - PullRequest
0 голосов
/ 01 февраля 2019

Исходя из этого вопроса Как отловить пустой определенный макрос с помощью gcc? У меня есть другая проблема.Как отловить неопределенный макрос в состоянии препроцессора #if?Пример кода:

#include <stdio.h> 

int main()
{
#if ENABLE_SOMETHING == 1
    ... do something ..
#endif
 return 0;
}

Есть ли способ отловить ошибку / предупреждение, когда ENABLE_SOMETHING не установлен с помощью компилятора gcc (может быть, какой-нибудь флаг)?Или, может быть, есть внешние инструменты, которые я могу использовать?


Я знаю, чем могу написать что-то вроде этого:

#ifndef ENABLE_SOMETHING
    #error "ENABLE_SOMETHING undefined!"
#endif

Но у меня огромное количество различных определений (ENABLE_STH1, ENABLE_STH2, ENALBE_STH3 ... и т. Д.) В коде, и я не хочу это исправлять вручную.Я ищу какое-то автоматическое решение для нашего проекта.

Ответы [ 4 ]

0 голосов
/ 01 февраля 2019

Есть ли способ отловить ошибку / предупреждение, когда ENABLE_SOMETHING не установлен с помощью компилятора gcc (может быть, какой-нибудь флаг)?

С GCC вы можете использовать флаг -Wundef.

Из официальной документации

-Wundef

Предупредить, если в директиве #if вычислен неопределенный идентификатор.Такие идентификаторы заменяются на ноль.

РЕДАКТИРОВАТЬ:

Например, этот C-код:

#include <stdio.h>

int main(void)
{
#if UNDEFINED_MACRO
  printf("hi mum!\n");
#endif

  return 0;
}

... скомпилировано с GCC, и флаг -Wundef выдает это:

$ gcc undef.c -Wundef
undef.c: In function 'main':
undef.c:5:5: warning: "UNDEFINED_MACRO" is not defined [-Wundef]
 #if UNDEFINED_MACRO
     ^
0 голосов
/ 01 февраля 2019

Вы можете попробовать что-то вроде следующего:

#ifndef MAX_N_LENGTH
#warning "MAX_N_LENGTH is undefined"
    int array[16];
#else
    int array[MAX_N_LENGTH + 1];
#endif
0 голосов
/ 01 февраля 2019

Вы можете проверить, определен ли макрос в выражении препроцессора #if с помощью defined(ENABLE_SOMETHING):

#if !defined(ENABLE_SOMETHING)
  #error ENABLE_SOMETHING is not defined
#endif

Вы можете обрабатывать макросы с пустым определением следующим образом:

#if ENABLE_SOMETHING + 0 == 1
   /* ENABLE_SOMETHING is defined and not 0 or empty */
#endif
0 голосов
/ 01 февраля 2019

Давайте предположим, что у вас есть этот код, и он компилируется, но вы не знаете, является ли MAX_N_LENGTH макросом или что-то еще:

int main()
{
    int a = MAX_N_LENGTH; // MAX_N_LENGTH could also be an int declared somewhere else
    return 0;
}

Вы можете проверить, действительно ли этотакой макрос:

#ifdef MAX_N_LENGTH
    printf("MAX_N_LENGTH is a macro.\n");
#else
    printf("MAX_N_LENGTH is NOT macro.\n");
#endif // MAX_N_LENGTH

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

...