c - C宏的乐趣

标签 c macros

假设我在 C 中有一个名为 FOO 的函数宏。还有两个宏称​​为 BAR1BAR2,它们基​​本上是同一个宏的两种风格。我想编写一个宏 BAR 以便它在使用 BAR 之前在某处调用 FOO 的函数中扩展为 BAR1 BAR2 否则。例如:

void func1(void)
{
    FOO();
    ...
    BAR();
}

相当于

void func1(void)
{
    FOO();
    ...
    BAR1();
}

虽然这个函数:

void func2(void)
{
    BAR();
}

相当于

void func2(void)
{
    BAR2();
}

我想避免在运行时引入全局变量或进行额外的检查。这可能吗?

最佳答案

简短的回答:不。 C 预编译器对函数限制一无所知,因此即使您根据需要设法修改了 BAR 宏,无论如何也不会限于当前函数。

现在,如果您愿意,可以向 BAR 宏添加一些检查。并且可以编写这些检查以在编译时解决,因此不会产生运行时开销。

例如:

extern char _sentinel_[2];

#define FOO() char _sentinel_;

#define BAR() if (sizeof(_sentinel_) == 1) BAR1() else BAR2()

诀窍是查找变量_sentinel_ 将解析全局变量或局部变量,这取决于FOO() 的使用。由于 if 中的条件是一个编译器常量,编译器将优化其他分支。

关于c - C宏的乐趣,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18077504/

相关文章:

python - 不允许操作 : Server-setsockopt() error for SO_BINDTODEVICE

c++ - Visual Studio 无法识别 __AVX2__ 或 __AVX__

rust - 如何在程序宏生成的代码中创建卫生标识符?

C++ 宏将处理代码置于命名空间之外

c - 确定大端或小端机器的宏定义?

c++ - 如何测试是否定义了只能通过#define 宏访问的标识符?

c - fscanf 未按预期从文件中读取

c - 没有正确显示矩阵的转置?

在c中捕获一个退出线程

c - 这个条件是否足以进行乘法溢出检查