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

У меня есть файл 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?


person Robert Martin    schedule 22.02.2012    source источник
comment
Это возможно в файле makefile.   -  person Emil Dumbazu    schedule 23.02.2012
comment
вы обычно делаете это с помощью ./configure скрипта   -  person Karoly Horvath    schedule 23.02.2012
comment
возможный дубликат Может ли препроцессор C быть используется, чтобы определить, существует ли файл?   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 02.08.2015


Ответы (4)


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

person IProblemFactory    schedule 22.02.2012
comment
@asaelr Не уверен, что это верно для всех, но в моей настройке сборки PP / CC смело нажимает, если не может найти включаемый файл. Итак, #include <special.h>, за которым следует #ifndef __SPECIAL_H__, работает для меня - person Robert Martin; 23.02.2012
comment
Если у меня кроссплатформенный код, я хочу проверить, существует ли platform-specific.h, прежде чем импортировать его. Используя этот подход с clang, я должен импортировать его, чтобы увидеть, определено ли что-то, но если оно не существует, попытка импорта является ошибкой компилятора / компоновщика. - person Ky Leggiero; 11.06.2020
comment
Это не будет работать во всех компиляторах, потому что они не смогут выполнить компиляцию на отсутствующем включении. - person Azeroth2b; 11.01.2021

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

person Vik    schedule 28.03.2014
comment
gcc также имеет это. Там написано gcc 5, но мне кажется, что 4.9 работает нормально. - person Henry Gomersall; 09.01.2015

Нет, это невозможно. Все, что вы можете сделать, это попробовать #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
person Adam Rosenfield    schedule 22.02.2012
comment
yepp, но имеет смысл выдавать предупреждение / ошибку из скрипта настройки ... - person Karoly Horvath; 23.02.2012

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

$ LC_MESSAGES=en_US gcc -c bar.c
bar.c:1:17: fatal error: foo.h: No such file or directory
compilation terminated.
person jørgensen    schedule 23.02.2012
comment
Итак, фатальная ошибка и предупреждение для вас в значительной степени одно и то же, не так ли? - person Armen Tsirunyan; 23.02.2012