函数称为c宏的参数
Function call as argument to C macro
首先一个小代码:
int counter = 0;
int get_counter() { return counter++; }
#define EVEN_OR_ZERO(cc) ( (cc) % 2 == 0 ? (cc) : 0 )
int next_even_or_zero = EVEN_OR_ZERO(get_counter());
此代码似乎还可以,但是...让我们扩展宏:
int next_even_or_zero = get_counter() % 2 == 0 ? get_counter() : 0;
您可以看到宏只能返回奇数 - 这与预期(或所需的)相反。
问题:有什么方法可以按照宏观的意图获得这项工作?还是常规功能是唯一要走的方法?
//This works as wanted
int even_or_zero(int value) { return value % 2 == 0 ? value : 0; }
#define EVEN_OR_ZERO(cc) even_or_zero(cc)
这可能是一个完美的答案或一个坏笑话,具体取决于您为什么需要一个宏(您没有告诉我们的宏)。
答案很简单:除非有充分的理由,否则不要使用宏。这种情况不是其中之一:
int even_or_zero(int i) {
if (i % 2) {
return 0;
} else {
return i;
}
}
制作两个功能。
int getCurrentCounter() { ... } // just return here
int getNextCounter() { ... } // increment here
这就是 - 示例 - 序列是psql的工作。
另外,这似乎是非常糟糕的代码设计。
- 不要在C 中使用宏,有更多更好的方法可以在不使用它们的情况下实现您想要的东西
- 在全局变量上具有副作用的功能不是很好。考虑一下,使用其计数器创建结构/类并不更好,然后添加方法。或者更好的是,可以将方法隐藏为固定方法/班级的prive,以限制谁可能影响柜台。
相关文章:
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类