我目前正在清理现有的 C 库以无耻地发布它。
预处理器宏用于在编译时NPOT
为给定的整数常量表达式计算二的下一个更大的幂。该宏通常用于直接初始化。对于所有其他情况(例如使用可变参数),有一个具有相同功能的内联函数。
但是如果用户传递一个变量,算法就会扩展为一大段机器代码。我的问题是: 我可以做些什么来防止用户向我的宏传递除整数常量表达式之外的任何内容?
#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 这样的变量……脏的,危险的,不要它。 - 文档,不适用于大多数用户。