空函数宏

Empty function macros

本文关键字:函数      更新时间:2023-10-16

如果我定义了一个没有实际主体的函数宏,它是否像编译器中的空字符串(即它在编译时不会生成任何额外的指令)?

示例:

#define SomeMacro(a)
SomeMacro("hello"); // This line doesn't add any instructions, does it?

您完全正确,空宏不会生成任何代码。

我见过两个地方,这是有用的。第一种是在不使用功能参数时消除警告:

#define UNUSED(x)
int foo(int UNUSED(value))
{
    return 42;
}

第二种是使用条件语句来确定是否应该有代码。

#ifdef LOGGING_ENABLED
#define LOG(x) log_message(x)
#else
#define LOG(x)
#endif

您的代码不完全正确,我建议您在宏中放置空括号

#define somemacro(a) {}

原因很简单,你的代码会更安全!

举个例子:

if(Value)
    somemacro(a)
else
    somemacro(b)

如果宏为空,您的代码将不会编译!("else"之前应为主表达式)。无论如何,某些风格规则迫使你写

if(Value)
{
    somemacro(a)
}
else
{
    somemacro(a)
}

所以这不会成为问题。

另一个选项是使用";"而不是"{}",但在相同情况下,该选项将向您发出编译时警告,而空大括号不会发出警告或错误!(即使发出警告,分号仍然更好);)

以为例

if(value)
    somemacro(a);
else
    somemacro(b);

将扩展到

if(value)
{};
else
{};

无法编译!

这就是为什么宏是邪恶的

(由于宏是简单的文本替换,因此dumps的规则应该是始终尝试手动替换代码,看看会发生什么,还有一些工具可以替换宏,以显示扩展的代码。)

还在猜测是否有一个宏是完全安全的?是的,它被称为"NOP"

#define somemacro(a) ((void)0)

它在任何情况下都能工作(例如,即使编译器的源文件也将其用作NOP只需查看"assert.h"

这是正确的。您的代码扩展到
;

预处理后。

请注意,您可以要求编译器在预处理后向您显示代码(在gcc中,这是-E选项;编译器可能会有所不同)。

预处理器对所有宏执行文字替换。

因此,如果定义了一个"空"宏,那么在编译器运行之前,预处理器将用一条空语句替换代码中出现的每个标识符。

是的。不会为您的问题中给出的示例生成任何代码。