Во время компиляции как найти макрос определяется в каком заголовочном файле

Давайте возьмем приведенный ниже код. Если макрос HAVE_SYS_SELECT_H определен, то они включают файл заголовка. Мне нужно знать, где находится макрос? То есть в каком заголовочном файле макрос определен.

Есть ли возможность для этого при компиляции исходного кода?

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

#ifdef HAVE_SYS_SELECT_H
    #include <sys/select.h>
#endif

person pretty    schedule 17.06.2016    source источник
comment
вы можете использовать ctags.   -  person Haris    schedule 17.06.2016
comment
Это не настоящий ответ, за исключением, возможно, небольшого: большая часть HAVE_XXX будет исходить из config.h, автоматически сгенерированного autoconfig.   -  person unwind    schedule 17.06.2016
comment
Найдите все файлы заголовков в папке вашего проекта. Скорее всего, он приходит в автоматически сгенерированном заголовочном файле, что означает, что заголовочный файл может еще не существовать, а заголовочный файл с его макросом будет создан скриптом configure (или подобным).   -  person Some programmer dude    schedule 17.06.2016
comment
Также не могли бы вы рассказать нам, почему вам нужно знать, где находится макрос? Какую настоящую проблему вы пытаетесь решить? Дополнительная литература о проблеме XY.   -  person Some programmer dude    schedule 17.06.2016
comment
@Jaochim Тогда как мне узнать, определен ли этот макрос уже или нет? Также я не могу использовать оператор printf, чтобы проверить, определен ли этот макрос или нет, потому что перед основной функцией только они объявили заголовки.   -  person pretty    schedule 17.06.2016
comment
Я предполагаю, что проблема в том, что вам нужно использовать select функция в среде POSIX? Тогда нет никакой уверенности в том, что функция объявлена ​​в заголовочном файле <sys/select.h> или в том, что этот файл вообще существует. Если вы ориентируетесь на другую операционную систему (например, Windows), вероятность того, что заголовочный файл существует, еще меньше. Просто поверьте системе автоконфигурации, что она найдет правильный заголовок, где объявлено select, иначе вам нужно связаться с автором и сообщить им об этом.   -  person Some programmer dude    schedule 17.06.2016
comment
Ладно, как раскрутил сказал, что может быть в конфигурационном файле. Теперь я хочу знать, какие макросы уже определены при компиляции кода. Я отсылаю человека gcc, но ....   -  person pretty    schedule 17.06.2016


Ответы (2)


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

#define TEST 1
#define TEST_FILE __FILE__

файл "mac.c":

#include <stdio.h>
#include <limits.h>
#include <stdint.h>

#include "mac.h"
#define DEBUG 1

int main()
{ 
#ifdef DEBUG
    printf("%s",TEST_FILE); // C:\tmp\mac.c
#endif
} 

препроцессор удаляет директиву include в C, поэтому вывод этого примера кода представляет собой путь к файлу «mac.c», например («C:\tmp\mac.c»).
поэтому я думаю, что есть только одно решение для ваш вопрос:
используя возможности статического анализа кода вашего редактора или такие инструменты, как:
http://clang-analyzer.llvm.org/

и см.:
Как быстро найти во всех включенных файлах заголовков в проекте определенную функцию или макрос?
Как быстро идентифицировать функции из заголовочных файлов?

person Community    schedule 17.06.2016

#warning используется для проверки того, определен макрос или нет. В функциях мы можем использовать printf, чтобы проверить, включен он или нет. Но некоторые макросы в заголовках, мы не можем использовать printf. Таким образом, мы можем использовать #warning или #error

     #ifdef HAVE_SYS_SELECT_H
     #warning "defined" 
         #include <sys/select.h>
     #endif
person pretty    schedule 28.06.2016