2017-01-20 3 views
3

Скажем, у нас есть main.c:Как установить глубину gcc -E (уровень предварительной обработки)?

#define f() { \ 
    foo(); \ 
    bar(); \ 
} 

#define F() { \ 
    f();  \ 
    f();  \ 
} 

F(); 

Теперь, если мы gcc -E main.c -o main.i, в main.i есть:

# 1 "main.c" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "main.c" 
# 11 "main.c" 
{ { foo(); bar(); }; { foo(); bar(); }; }; 

Что делать, если я не хочу внутренние макросы (например, f()) быть расширен. Как я могу получить что-то вроде:

# 1 "main.c" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "main.c" 
# 11 "main.c" 
{ f(); f(); }; 

Также, если возможно, то как я могу настроить глубину расширения?

+0

Возможно возможное обходное решение, только если вам разрешено изменять исходный код (и даже в этом случае его все равно будет сложно применить в больших проектах), нужно было бы ввести правильный '#undef f' в подходящие местоположения, возможно, в каком-либо блоке '# ifdef'-' # endif', чтобы легко активировать/отключить через командную строку (через '-D'). Однако это все равно не будет работать во всех случаях. – chrk

ответ

2

Простой ответ (по крайней мере для препроцессора C Я знаю):

Вы не можете - не в общем случае. Макросы расширяются путем рекурсии, а глубина рекурсии не может быть задана, например, GNU cpp.

В определенных случаях, когда «внешний» и «внутренний» макросы определены в разных файлах, вы можете несколько достичь того, чего хотите, просто не включив (или предоставляя пустой) файл, который определяет «внешнее» определение и подает файл с «внутренним» определением непосредственно в cpp.

Я, однако, есть реализация CPP для встроенной системы, которая на самом деле делает печать каждую рекурсию шаг к стандартному выводу при выполнении с наивысочайшим многословием («-vvv»), хотя это не поможет вам с НКУ/cpp - Но это, по крайней мере, показывает, что что-то вроде того, что вы хотите, технически возможно.

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