我今天在一个包含#define宏的C ++文件中遇到了一个函数 该函数以return语句结束,后跟一个#undef宏 一个例子是......
int test() {
#define STUFF()...
return 0;
#undef STUFF
}
这是好的还是坏的做法,这样做有什么优点或缺点,或者#undef是否需要在返回确认之前找到?
答案 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
)