如果使用#define而没有任何赋值,它会怎么做?

时间:2016-12-16 07:28:12

标签: c++

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

4 个答案:

答案 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,第一个分支将被选中。