【发布时间】:2016-12-16 07:28:11
【问题描述】:
#define TML_ID - 没有为 TML_ID 分配值。编译或构建可执行文件没有问题。这会将任何默认值(如 null)分配给 TML_ID 还是将 TML_ID 视为未定义?
【问题讨论】:
-
你怎么知道它没有价值?空字符串呢?
-
C duplicate,C++ 中的答案相同。
标签: c++
#define TML_ID - 没有为 TML_ID 分配值。编译或构建可执行文件没有问题。这会将任何默认值(如 null)分配给 TML_ID 还是将 TML_ID 视为未定义?
【问题讨论】:
标签: c++
这只是表示宏已定义,因此您可以在main 或任何其他函数中执行此操作:
#ifdef TML_ID
printf("Defined!\n");
#else
printf("Undefined!\n");
#endif
【讨论】:
#endif(必须)
#define 没有给宏赋值。事实上,它被认为是一个标志,告诉编译器已经定义了一个特定的宏。
你可以把它想象成你声明一个变量而不分配任何值。它将有一个垃圾值,但它会在内存中保留一个空间。但是在宏的情况下,定义不会保留空间。只是对编译器的提示。
【讨论】:
在没有赋值的情况下,这种方式的宏通常用于防止多次包含同一个.h文件,这种方式:
#ifndef _FILENAME
#define _FILENAME
//declaration code
#endif
如果某个 .cpp 文件包含例如两个不同的 .h 文件,它们都包含我们的 .h 文件,那么 .cpp 将只有一份声明代码副本,因为第二次 _FILENAME 宏将被定义,并且声明代码将被跳过。
【讨论】:
_FILENAME) 的名称和包含两个连续下划线的名称保留供实现使用。不要在你的代码中使用它们。
#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,将选择第一个分支。
【讨论】: