Работает ли #ifdef (или другие директивы препроцессора) для объявлений функций (для проверки существования функции)? - PullRequest
5 голосов
/ 04 июня 2011

Почему следующий код не работает должным образом?

void foobar(int);

#ifndef foobar
  printf("foobar exists");
#endif

Это всегда печатает сообщение; очевидно, он не может обнаружить существование функции как объекта. (Это проблема перегрузки?)

Почему #ifdef (или его варианты) не могут обнаружить объявления функций? Объявления должны быть доступны при предварительной обработке, так что это должно работать, не так ли? Если нет, есть ли альтернатива или обходной путь?

Ответы [ 2 ]

8 голосов
/ 04 июня 2011

Декларации должны быть доступны на предварительная обработка, поэтому она должна работать, не так ли?

Препроцессор работает до компиляции (отсюда и «пре»), поэтому в этой точке нет скомпилированных символов, только расширение текста и текста. Препроцессор и компилятор явно отделены друг от друга и работают независимо друг от друга, за исключением того факта, что препроцессор изменяет источник, передаваемый компилятору.

Типичная схема выполнения чего-то подобного с препроцессором - это сопряжение объявления функции с использованием функции с использованием той же define константы:

#define FOO

#ifdef FOO
 void foo(int);
#endif

#ifdef FOO
   printf("foo exists");
#endif
0 голосов
/ 04 июня 2011

Препроцессор работает с токенами препроцессора, которые определены с использованием директив препроцессора.Препроцессор не работает с типами, объявленными в вашем коде (каким бы ни был язык).

Вы должны использовать директиву препроцессора #define, чтобы объявить токен, видимый для других проверок состояния препроцессора.

#define FOO

#if FOO
// this code will compile
int x = 5;
#else
// this code won't
int x = 10;
#endif
...