#define TML_ID
- 没有为TML_ID分配任何值。编译或构建可执行文件没有问题。这会将任何默认值(如null)分配给TML_ID,还是将TML_ID视为未定义?
答案 0 :(得分:4)
这只是说宏已定义,因此您可以在main
或任何其他函数中执行此操作:
#ifdef TML_ID
printf("Defined!\n");
#else
printf("Undefined!\n");
#endif
答案 1 :(得分:0)
#define
没有为宏指定值。实际上,它被认为是告诉编译器已定义特定宏的标志。
您可以将其想象为声明一个变量而不指定任何值。它将具有垃圾值,但它将在内存中保留一个空间。但是在宏观的情况下,定义不会保留空间。只提示编译器。
答案 2 :(得分:0)
如果没有赋值,这种方式的宏通常用于防止多次包含相同的.h文件,这样:
#ifndef _FILENAME
#define _FILENAME
//declaration code
#endif
如果某个.cpp文件包含两个不同的.h文件,它们都包含我们的.h文件,那么.cpp将只有一个声明代码副本,因为第二次_FILENAME宏将被定义,并且声明代码将被跳过。
答案 3 :(得分:0)
#define MACRO
定义了一个名为MACRO的宏。它没有内容,所以如果你写了类似std::cout << MACRO
之类的内容,你就会收到错误,因为那里什么都没有。这通常用于有条件地使用新关键字:
#if CPP_VERSION_C11
#define NOEXCEPT noexcept
#else
#define NOEXCEPT
#endif
void f() NOEXCEPT {
// whatever
}
您可以使用其他两种方法来使用此类宏。您可以检查它是否已定义:
#ifdef MACRO
// code for one branch
#else
// code for other branch
#endif
对于该代码,由于已定义MACRO
,预处理器将查看第一个分支中的代码,并跳过第二个分支中的代码。如果尚未定义MACRO
,则会跳过第一个分支中的代码而不是第二个分支中的代码。你也可以这样做:
#if defined(MACRO)
或者您可以在预处理器指令中的常量表达式中使用它:
#if MACRO
// code for one branch
#else
// code for other branch
#endif
这里,MACRO
获取值0,#if
看到值0,预处理器跳过第一个分支。在更复杂的表达式中也会发生同样的事情:
#if MACRO + 1 > 0
// code for one branch
#else
// code for other branch
#endif
此处,MACRO
的值为0,MACRO + 1
的值为1,第一个分支将被选中。