如果使用#Define而没有任何分配值,它将做什么

If #define is used without any assignment value, what will it do?

本文关键字:什么 分配 任何 #Define 如果      更新时间:2023-10-16

#define TML_ID-未分配给tml_id的值。编译或构建可执行文件没有问题。这将分配任何默认值(例如null)到tml_id还是将tml_id视为未定义?

这只是说宏是定义的,因此您可以在main或任何其他功能中执行此操作:

#ifdef TML_ID
printf("Defined!n");
#else
printf("Undefined!n");
#endif

#define不会为宏分配一个值。实际上,它被认为是告诉编译器已经定义了特定宏的标志。

您可以想象它好像您在不分配任何值的情况下声明变量一样。它将具有垃圾价值,但它将在内存中保留一个空间。但是,如果有宏观,则该定义不会保留一个空间。仅是编译器的提示。

没有分配的值,以这种方式宏通常用于预防多次包含相同的.h文件,这样:

#ifndef _FILENAME
#define _FILENAME
//declaration code
#endif

如果某些.cpp文件包括两个不同的.h文件,这两个文件都包括我们的.h文件,则.cpp将只有一个声明代码的副本,因为第二次将定义_filename acra,并且声明代码将跳过。

#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,并且将选择第一个分支。