【发布时间】:2012-02-14 09:33:20
【问题描述】:
我目前正在清理现有的 C 库以无耻地发布它。
预处理器宏NPOT 用于计算给定整数常量表达式的下一个较大的2 次幂在编译时。该宏通常用于直接初始化。对于所有其他情况(例如使用可变参数),有一个具有相同功能的内联函数。
但是如果用户传递一个变量,算法就会扩展为一大段机器代码。我的问题是: 我可以做些什么来阻止用户向我的宏传递除整数常量表达式之外的任何内容?
#define NPOT(x) complex_algorithm(x)
const int c=10;
int main(void) {
int i=5;
foo = NPOT(5); // works, and does everything it should
foo = NPOT(c); // works also, but blows up the code extremely
foo = NPOT(i); // blows up the code also
}
我已经尝试过的:
- 将宏定义为
#define NPOT(x) complex_algorithm(x ## u)。它仍然可以工作并且抛出一个 - 即使几乎没有帮助 - 变量参数的编译器错误。除非没有像 iu 这样的变量……脏的、危险的,不要它。 - 文档,不适用于大多数用户。
【问题讨论】:
-
为了道德化,我认为这个问题是一个很好的例子,说明为什么宏一开始就不好。它有点像高度成瘾的药物。你知道它们很糟糕,一旦你开始使用它们,你就无法摆脱。你会发现自己越来越需要它们。看看这里真正需要什么的字里行间:“有没有人知道一个宏来修复这个宏,它调用一个宏。”
-
即使这样我也找不到任何不好的宏调用另一个宏,这不是重点。上面的 complex_algorithm 代表你可能想要的任何东西。除了内联函数之外还有一个宏可以在直接初始化中使用它,同时有机会验证参数。
标签: c macros c-preprocessor constant-expression