【问题标题】:undef macro after return statement in C++C++中return语句后的undef宏
【发布时间】:2014-05-07 20:57:44
【问题描述】:

我今天在一个包含#define 宏的 C++ 文件中发现了一个函数。
该函数以 return 语句结束,后跟 #undef 宏。
一个例子是......

int test() {
    #define STUFF()...

    return 0;
    #undef STUFF
}

这是好的还是坏的做法,这样做有什么好处或坏处,或者#undef是否需要在返回之前定位才能被确认?

【问题讨论】:

  • 这是一个预编译器指令。它在运行时被忽略。

标签: c++ macros


【解决方案1】:

这样做很好,此外,宏名称可能与另一个宏名称冲突。因此,您可以使用诸如“A”之类的荒谬短名称或诸如“LIBRARY_LIBRARY_NAME_TEMPORARY_MACRO”之类的荒谬长名称

你应该在使用maco之后放置#undef。

【讨论】:

  • 我会投票支持更长的名称,以防其他人看到同样的建议。 :)
  • @cHao 短片也有一些魅力(由于#undef)
  • 我喜欢少打字。 :) 但是如果两个定义都不是“命名空间”*,则可能会践踏现有的宏。 (* 在命名约定的意义上,不是 C++ 的。)
【解决方案2】:

#define 和#undef 是编译器指令。它们是代码预处理的一部分,运行时与它们相对于“真实”代码的位置无关。

基本上,在编译器运行您的代码之前,它会遍历每个指令(#include、#define、#ifdef)并预处理您的代码,例如,当您这样做时:

int firstVariable = MY_DIRECTIVE;
#define MY_DIRECTIVE 7
int doesNothing = 9;

int myVariable = MY_DIRECTIVE;
#undef MY_DIRECTIVE
int thirdVariable = MY_DIRECTIVE;

它把它转换成:

int firstVariable = MY_DIRECTIVE;

int doesNothing = 9;

int myVariable = 7;

int thirdVariable = MY_DIRECTIVE;

并且只有在它编译你的代码之后(在这种情况下给你一个错误,即 MY_DIRECTIVE 没有在第 1 行和第 7 行定义)

更多信息: Preprocessor directives (cplusplus)

【讨论】:

    【解决方案3】:

    我不会将#defined 的函数内容称为“最佳实践”。正如@IanMedeiros 所指出的,它是一个预编译器指令,这意味着当编译器运行时它已经被扩展。很难理解原作者的想法,但我会考虑一种更清晰的方法,它记录了更多作者的推理,例如:

    int test() {
       #if defined(INCLUDE_STUFF)
       Stuff()
       #endif
    )
    

    【讨论】:

      猜你喜欢
      • 2022-11-17
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多