Может ли препроцессор C обнаружить, что файл заголовка не может быть найден, и выдать конкретное предупреждение? - PullRequest
9 голосов
/ 23 февраля 2012

У меня есть файл C , для которого требуется определенный заголовочный файл.Если этот заголовочный файл не существует, я хочу, чтобы препроцессор выдал конкретное предупреждение.Что-то вроде:

#if !(#include <special.h>)
#warning "Don't worry, you can fix this."
#warning "You just need to update this other repo over here:"
#endif

Возможно ли это с препроцессором C ?

Ответы [ 4 ]

16 голосов
/ 28 марта 2014

Я знаю, что это старый вопрос, но мне также нужен был способ сделать это, и я был разочарован, когда прочитал эти ответы. Оказывается, у clang есть хорошая директива __has_include("header name"), которая безупречно работает для того, что вам нужно :) Может быть, вы хотите проверить, доступна ли директива сначала, позвонив по номеру #if defined(__has_include)

9 голосов
/ 23 февраля 2012

Вы всегда можете проверить, если макрос #define X из включенного файла ... определен:)

7 голосов
/ 23 февраля 2012

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

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

Например,он может определить HAVE_SYS_TIME_H, если ваша система сборки содержит заголовок <sys/time.h>, поэтому вы можете написать такой код:

#if HAVE_SYS_TIME_H
#include <sys/time.h>
#else
#warning "Don't worry, you can fix this."
#endif
0 голосов
/ 23 февраля 2012

Если все, что вам нужно, это предупреждение о том, что заголовочный файл отсутствует (и нет пользовательского кода), то большинство компиляторов уже предоставят вам его.

$ LC_MESSAGES=en_US gcc -c bar.c
bar.c:1:17: fatal error: foo.h: No such file or directory
compilation terminated.
...