Как можно визуализировать директивы C / C ++ #define? - PullRequest
0 голосов
/ 27 февраля 2019

Я ищу способы визуализировать эффекты # define's. Например, код, не видимый компилятором, отображается другим цветом.

В основном визуальная студия, но приятно знать о других средах?В идеале также код, видимый компилятором, но не будет запущен.

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Visual Studio делает это уже по умолчанию, по крайней мере, с VS2005 и намного лучше с VS2010 (по this Q / A):

enter image description here

Редактировать: Добавлено в ответ на другой ответ:

enter image description here

0 голосов
/ 27 февраля 2019

Как я могу визуализировать 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).

0 голосов
/ 27 февраля 2019

Один из способов - просмотреть источник после предварительной обработки, используя gcc (для C) или g ++ (для c ++), просто используйте опцию -E

Например, имея файл p.cc

#ifdef FOO
# define BAR 1
#else
# define BAR 2
#endif

int main()
{
  return BAR;
}

, если я не определяю FOO У меня есть:

/tmp % gcc -E p.cc
# 1 "p.cc"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "p.cc"

int main()
{
  return 2;
}

, если я определяю FOO У меня есть:

/tmp % gcc -DFOO -E p.cc
# 1 "p.cc"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "p.cc"

int main()
{
  return 1;
}

Примечание: у вас, вероятно, есть #include в вашем источнике, поэтому после предварительной обработки вы получите много строк, приходящих из включенных файлов, на вопрос Как показать «обработанный» код игнорирования включает в себя с GCC Я положил ответ, чтобы обойти их.

...