【问题标题】:If #define is used without any assignment value, what will it do?如果使用#define 没有任何赋值,它会做什么?
【发布时间】:2016-12-16 07:28:11
【问题描述】:

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

【问题讨论】:

  • 你怎么知道它没有价值?空字符串呢?
  • C duplicate,C++ 中的答案相同。

标签: c++


【解决方案1】:

这只是表示宏已定义,因此您可以在main 或任何其他函数中执行此操作:

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

【讨论】:

  • #endif(必须)
  • @qxz,是的,我忘记了,谢谢指出。现已编辑。
  • 谢谢。是的,即使没有为其分配值,它也被视为已定义。
  • @ForceBru 在编译之前,C 预处理器将扩展宏,用它们的值替换它们的文本外观。如果定义了一个没有值的宏,就像其他答案所说的那样,它们的值将是垃圾(未定义),在这种情况下,预处理器如何知道要替换哪个值?
  • @torez233,其他答案都没有说它们的值将是垃圾。如果一个宏没有值,这个宏的使用将被简单地删除(那个使用将被替换为空)。
【解决方案2】:

#define 没有给宏赋值。事实上,它被认为是一个标志,告诉编译器已经定义了一个特定的宏。

你可以把它想象成你声明一个变量而不分配任何值。它将有一个垃圾值,但它会在内存中保留一个空间。但是在宏的情况下,定义不会保留空间。只是对编译器的提示。

【讨论】:

  • 感谢您的解释。
  • 没有任何替换文本的宏没有垃圾值。
  • @PeteBecker 没错,这就是我使用“标志”一词的原因。这也是未定义宏和未使用变量之间的区别。
【解决方案3】:

在没有赋值的情况下,这种方式的宏通常用于防止多次包含同一个.h文件,这种方式:

#ifndef _FILENAME
#define _FILENAME

//declaration code

#endif

如果某个 .cpp 文件包含例如两个不同的 .h 文件,它们都包含我们的 .h 文件,那么 .cpp 将只有一份声明代码副本,因为第二次 _FILENAME 宏将被定义,并且声明代码将被跳过。

【讨论】:

  • 以下划线开头后跟大写字母 (_FILENAME) 的名称和包含两个连续下划线的名称保留供实现使用。不要在你的代码中使用它们。
【解决方案4】:
#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,将选择第一个分支。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多