在C ++中返回语句后的undef宏

时间:2014-05-07 20:57:44

标签: c++ macros

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

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

    return 0;
    #undef STUFF
}

这是好的还是坏的做法,这样做有什么优点或缺点,或者#undef是否需要在返回确认之前找到?

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

#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;

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

欲了解更多信息: Preprocessor directives (cplusplus)

答案 2 :(得分:0)

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

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