Печать имени и значения макроса

Попробуйте это...

IF NOT EXISTS(
  SELECT TOP 1 1
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE 
    [TABLE_NAME] = 'Employees'
    AND [COLUMN_NAME] = 'EmployeeID')
BEGIN
  ALTER TABLE [Employees]
    ADD [EmployeeID] INT NULL
END
11
задан Jens 11 August 2015 в 13:19
поделиться

10 ответов

Если вы готовы мириться с тем фактом, что SOMESTRING = SOMESTRING указывает, что SOMESTRING не был определен (считайте, что токен не был переопределен!?!), Тогда должно выполняться следующее:

#include <stdio.h>

#define STR(x)   #x
#define SHOW_DEFINE(x) printf("%s=%s\n", #x, STR(x))

#define CHARLIE -6
#define FRED 1
#define HARRY FRED
#define NORBERT ON_HOLIDAY
#define WALLY

int main()
{
    SHOW_DEFINE(BERT);
    SHOW_DEFINE(CHARLIE);
    SHOW_DEFINE(FRED);
    SHOW_DEFINE(HARRY);
    SHOW_DEFINE(NORBERT);
    SHOW_DEFINE(WALLY);

return 0;
}

Вывод:

BERT=BERT
CHARLIE=-6
FRED=1
HARRY=1
NORBERT=ON_HOLIDAY
WALLY=
28
ответ дан 3 December 2019 в 01:21
поделиться

Чтобы написать МАКРОС, который расширяется до другого МАКРОСа, потребуется, чтобы препроцессор дважды запускал его.
Это не сделано.

Вы можете написать простой файл,

// File check-defines.c
int printCompileTimeDefines()
{
#ifdef DEF1
  printf ("defined : DEF1\n");
#else // DEF1
  printf ("undefined: DEF1\n");
#endif // DEF1
// and so on...
}

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

Если у вас есть строки #DEFINE внутри исходного файла, а не Makefile ,
Переместите их в другой файл заголовка и включите этот заголовок во все исходные файлы,
включая этот check-define.c .

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


Чтобы автоматизировать создание этой функции ,
вы можете использовать макроязык M4 (или даже сценарий AWK на самом деле).
M4 становится вашим препроцессором.

4
ответ дан 3 December 2019 в 01:21
поделиться

Вы не указали компилятор, который использовали. Если это gcc, вам может помочь gcc -E , поскольку он останавливается после этапа предварительной обработки и выводит результат предварительной обработки. Если вы сравните результат gcc -E с исходным файлом, вы можете получить часть того, что хотите.

2
ответ дан 3 December 2019 в 01:21
поделиться
#ifdef MYMACRO
  printf("MYMACRO defined: %d\r\n", MYMACRO);
#endif

Я не думаю, что то, что вы пытаетесь сделать, возможно. Вы запрашиваете информацию во время выполнения, которая была обработана перед компиляцией. Строка «MYMACRO» ничего не означает после того, как CPP расширил ее до своего значения внутри вашей программы.

2
ответ дан 3 December 2019 в 01:21
поделиться

Почему бы просто не протестировать его с препроцессор?

 #if defined(X)
      printf("%s is defined and as the value %d\n", #X, (int)X);
 #else
      printf("%s is not defined\n", #X);
 #endif

Можно также встроить это в другой тест, чтобы не печатать его каждый раз:

 #if define(SHOW_DEFINE)
 #if defined(X)
      printf("%s is defined and as the value %d\n", #X, (int)X);
 #else
      printf("%s is not defined\n", #X);
 #endif
 #endif
2
ответ дан 3 December 2019 в 01:21
поделиться

Волновая библиотека от boost также может быть полезной, чтобы делать то, что вы хотите. Если ваш проект достаточно большой, думаю, стоит попробовать. Это препроцессор C ++, но в любом случае они одинаковы :)

1
ответ дан 3 December 2019 в 01:21
поделиться

Я считаю, что то, что вы пытаетесь сделать, невозможно. Если вы можете изменить способ работы вашего #define s, то я предлагаю что-то вроде этого:

#define ON 1
#define OFF 2

#define OPTIMIZE_FOO ON
#define OPTIMIZE_BAR OFF

#define SHOW_DEFINE(val)\
    if(val == ON) printf(#val" is ON\n");\
    else printf(#val" is OFF\n");
1
ответ дан 3 December 2019 в 01:21
поделиться

Это действительно невозможно, проблема заключается в части "не определено". Если вы полагались на значения макросов для активации / деактивации частей вашего кода, вы могли бы просто сделать:

#define SHOW_DEFINE(X) \
do { \
if (X > 0) \
    printf("%s %d\n", #X, (int)X);   \
else \
    printf("%s not defined\n", #X);   \
} while(0)
1
ответ дан 3 December 2019 в 01:21
поделиться

На основании Кришарриса, ответьте, что я сделал это. Хотя мой ответ не очень приятный, это именно то, что я хотел.

#define STR(x)   #x
#define SHOW_DEFINE(x) printf("%s %s\n", #x, strcmp(STR(x),#x)!=0?"is defined":"is NOT    defined")

Единственная обнаруженная мной ошибка - это определение не должно быть #define XXX XXX (где XXX равно XXX).

1
ответ дан 3 December 2019 в 01:21
поделиться

Этот вопрос очень близок к макросу , который печатает выражение и оценивает его (с помощью __STRING) . Ответ Chrisharris очень близок к ответу на предыдущий вопрос.

0
ответ дан 3 December 2019 в 01:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: