Как я могу визуализировать C / C ++ # define?
Краткий ответ: в целом вы не можете (и обратите внимание, что вы не определяете, что "визуализироватьзначит в твоем вопросе).Вы действительно хотите посмотреть на предварительно обработанную форму.С GCC вы практически получаете его с gcc -C -E
.
. В качестве провокационного примера __TIME__
или __LINE__
- это предопределенный магический предопределенный макрос (как и __COUNT__
, который является расширением GCC).Вам разрешено кодировать
#if __LINE__ % 2 == 0
printf("hello from line %d\n", __LINE__);
#endif
, и поведение зависит от того, где расположен этот странный код (на четной или нечетной строке).
Хорошо, чтопример надуманный, но законный.Проверьте, прочитав стандарт C11 n1570 .
Можно также представить себе #if __TIME__[1] == '2'
, но, вероятно, это не скомпилируется (поскольку выражения препроцессора не могут использовать индексирование []
).Однако, некоторые if (_TIME__[5] == '2') printf("hello\n");
будут компилироваться (и оптимизироваться по-разному, в зависимости от момента, когда вы его компилируете).
И на практике код, почти такой же надуманный, как и приведенный выше, существует.Хорошим примером кода C, использующего множество различных функций препроцессора, является код ядра исходного кода для Linux (вас может заинтересовать coccinelle , инструмент, который это знает).Первый шаг его сборки (с использованием make config
или make menuconfig
) генерирует множество заголовков, определяющих возможности вашего конкретного ядра.Существует много тысяч таких параметров конфигурации (у моего /boot/config-4.19.0-3-amd64
есть 7352 варианта конфигурации, и каждый из них преобразуется в некоторый макрос препроцессора, используемый в #if
).