Проверьте, объявлена ​​ли функция с препроцессором C? - PullRequest
16 голосов
/ 17 ноября 2009

Можно ли указать препроцессору C проверить, объявлена ​​ли функция (не макрос)? Я попробовал следующее, но это не работает:

#include <stdio.h>

int main(void)
{
#if defined(printf)
    printf("You support printf!\n");
#else
    puts("Either you don't support printf, or this test doesn't work.");
#endif
    return 0;
}

Ответы [ 5 ]

22 голосов
/ 17 ноября 2009

Нет. Препроцессор запускается до того, как компилятор C и компилятор C обрабатывают объявления функций. Препроцессор предназначен только для обработки текста.

Однако большинство заголовочных файлов содержат защитные макросы, такие как _STDIO_H_, которые вы можете проверить на этапе препроцессора. Однако это решение не является переносимым, так как имена включаемых защитных макросов не стандартизированы.

5 голосов
/ 17 ноября 2009

Если вы посмотрите на такие инструменты, как autoconf, то увидите, что они проходят множество тестов, чтобы определить, что у компьютера есть или нет, для правильной компиляции, затем они устанавливают правильные # DEFINES.

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

1 голос
/ 03 мая 2018

Строго говоря, нет, препроцессор не может сделать это самостоятельно. Однако вы можете немного помочь, автоматически создав соответствующие #defines.

Обычно, как было упомянуто выше, вы используете autotools, если в системе типа Unix. Тем не менее, вы также можете создать тот же эффект, используя make-файл. У меня недавно была причина обнаружить функцию «posix_fallocate», определяемую в заголовках, потому что я использовал uClibc, который, казалось, пропускал ее в более ранних версиях. Это работает в gnu make, но вы, вероятно, можете заставить подобное работать в других версиях:

NOFALLOC := $(shell echo "\#include <fcntl.h>\nint main() { posix_fallocate(0,0,0);}" | $(CC) -o /dev/null -Werror -xc - >/dev/null 2>/dev/null && echo 0 || echo 1)
ifeq "$(NOFALLOC)" "1"
    DFLAGS += -DNO_POSIX_FALLOCATE
endif
1 голос
/ 17 ноября 2009

Препроцессор - простая программа и почти ничего не знает о базовом языке. Он не может сказать, была ли объявлена ​​функция. Даже если это возможно, функция может быть определена в другой библиотеке, и символ разрешается во время компоновки, поэтому препроцессор не может помочь в этом.

0 голосов
/ 17 ноября 2009

Поскольку препроцессор не знает о языке C / C ++ (он действительно только выполняет замену текста), я бы предположил, что это невозможно. почему ты хочешь сделать это? Может быть, есть другой способ.

...