Попробуйте это...
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
Если вы готовы мириться с тем фактом, что 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=
Чтобы написать МАКРОС, который расширяется до другого МАКРОСа, потребуется, чтобы препроцессор дважды запускал его.
Это не сделано.
Вы можете написать простой файл,
// 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 становится вашим препроцессором.
Вы не указали компилятор, который использовали. Если это gcc, вам может помочь gcc -E , поскольку он останавливается после этапа предварительной обработки и выводит результат предварительной обработки. Если вы сравните результат gcc -E с исходным файлом, вы можете получить часть того, что хотите.
#ifdef MYMACRO
printf("MYMACRO defined: %d\r\n", MYMACRO);
#endif
Я не думаю, что то, что вы пытаетесь сделать, возможно. Вы запрашиваете информацию во время выполнения, которая была обработана перед компиляцией. Строка «MYMACRO» ничего не означает после того, как CPP расширил ее до своего значения внутри вашей программы.
Почему бы просто не протестировать его с препроцессор?
#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
Волновая библиотека от boost также может быть полезной, чтобы делать то, что вы хотите. Если ваш проект достаточно большой, думаю, стоит попробовать. Это препроцессор C ++, но в любом случае они одинаковы :)
Я считаю, что то, что вы пытаетесь сделать, невозможно. Если вы можете изменить способ работы вашего #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");
Это действительно невозможно, проблема заключается в части "не определено". Если вы полагались на значения макросов для активации / деактивации частей вашего кода, вы могли бы просто сделать:
#define SHOW_DEFINE(X) \
do { \
if (X > 0) \
printf("%s %d\n", #X, (int)X); \
else \
printf("%s not defined\n", #X); \
} while(0)
На основании Кришарриса, ответьте, что я сделал это. Хотя мой ответ не очень приятный, это именно то, что я хотел.
#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).
Этот вопрос очень близок к макросу , который печатает выражение и оценивает его (с помощью __STRING) . Ответ Chrisharris очень близок к ответу на предыдущий вопрос.