2014-01-28 3 views
-1

Мое требование состоит в том, чтобы получить список всех файлов заголовков, включенных в файл заголовка, рекурсивно, я использую в качестве примера на stdio.hВ C как определить все макросы unknow (используемые в исходном файле/файле заголовка) в командной строке

$ НКА -H stdio.h

, который подходит мне, как вы знаете, есть # Определяет, который делает условное включение некоторых других файлов заголовки на основе Macors, теперь я хочу такие # определить, чтобы быть переданы в командная строка, что-то вроде

$ gcc -D * -H stdio.h

, который автоматически определяет все макросы, используемые в файле заголовка. Я попытался, но не смог добиться успеха, любая идея, спасибо

+3

В чем проблема, которую вы пытаетесь решить? – yasouser

+0

Проблема, которую я пытаюсь решить, довольно описательна в моем вопросе, для чего я получил ответ от Маца Петерсона. – Cleonjoys

+0

По некоторым причинам я не могу раскрыть цель этого требования. Это не для компиляции двоичных файлов, а в том, чтобы углубиться в ОС. – Cleonjoys

ответ

3

Это невозможно, и также не имеет смысла определять ВСЕ макросы, используемые определенным заголовочным файлом. Некоторые из них могут быть взаимоисключающими.

Скажет, например, у вас есть:

#if ARCH_X86 
    ... stuff goes here for x86... 
#endif 
#if ARCH_ARM 
    .... stuff goes here for ARM ... 
#endif 

оригинальный автор, конечно, не хочет, чтобы вы скомпилировать это как с ARM и X86 с поддержкой в ​​то же время, так как эта комбинация не имеет никакого смысла в все.

И даже если вы должны были определить все определяет, вы бы не поймать вторую часть этого:

#if ARCH_X86 
    #include <x86_stuff.h> 
#else 
    #include <arm_stuff.h> 
#endif 

Если ваш проект имеет специальные определяет, а затем использовать их. Но все это не имеет никакого смысла.

Другая проблема состоит в том, что вы можете найти системно-зависимые файлы, и определяет, связанные с тем, например:

#ifdef WINDOWS 
    #include <windows.h> 
#elsif LINUX 
    #include <linux.h> 
#else 
    #error "Must be either Linux or Windows". 
#endif 

#if WINDOWS_THINGY_BOB 
    ... do stuff here ... 
#endif 

(Предполагая WINDOWS_THINGY_BOB это определяют набор путем включения windows.h)

другой потенциальная проблема заключается в том, что не все «#ifdef», но что-то вроде этого:

#if DEBUG==2 
    #include <debug_lots.h> 
#elsif DEBUG != 1 
    #include <debug_little.h> 
#else 
    #include <no_debug.h> 
#endif 

Если вы действительно хотите увидеть «если X определено, то это включено», вы придется писать собственный код, чтобы следовать различным путям с разными определениями, в том числе «не задано».

Я вижу, что это очень быстро усложнится, если у вас нет четкого набора «что такое среда, в которой я собираюсь».

+0

Привет, я знаю, что вы имеете в виду, и я согласен, на самом деле я знал это раньше, чем вы могли это рассказать, но мое требование совсем другое, а не для некоторых других мирских проектов, думал, что есть какой-то способ обойти это, если кто-то уже сделал/доступный с помощью gcc (отчасти, как -undef), в любом случае спасибо за подтверждение того, что такая вещь недоступна – Cleonjoys

+1

Я могу видеть, откуда вы родом, но, по моему опыту, вы почти наверняка «лаяли неправильное дерево» ». Я отредактировал свой ответ, чтобы освежить некоторые подробности «это будет странно». Если вы посмотрите на стандартные файлы заголовков, например glibc, вы обнаружите, что существует множество разных определений, которые могут или не могут применяться к конкретной среде, системе, архитектуре и т. Д. Другими словами, «установка всего» не является хорошо работать. Вам нужно понять, что будет и не будет установлено в вашем конкретном случае. –

0

Нет автоматического способа разбора файлов заголовков и передачи #define -s компилятору. Существует опция -D <name>, которая может использоваться для определения имен препроцессора. См. Здесь для деталей: 3.11 Options Controlling the Preprocessor

Один из вариантов заключается в создании make-файла и определении переменной CFLAGS с флагами, которые вы хотите передать компилятору.

Смежные вопросы