Macro returning the number of arguments it is given in C?
一个简单的实现
能否使用一个简单的宏在C语言中计算不定参数的数量,例如这样:
1 | foo(1) -> 1 |
一个比较简单的实现是这样的:
1 |
当参数为空时可能在某些编译器下不能正常的工作,但是稍微修改一下就行了。
1 |
这里使用了sizeof()关键字,就意味着它不是在预处理阶段计算不定参数的长度。同时要求参数必须为有意义的符号。这就限制了它的使用场景,比如说将不定参数的个数作为数组定义时的长度。
另外一种有趣的写法
这是我从网上找到的一种写法,它能够处理1~64个不定产生的情况,没有依赖于编译器的关键字,仅仅靠预处理就完成了参数的计数。
1 |
|
注释中也提到,当参数为空时需要编译器的特殊支持。但是我发现做适当的修改就能够避免这种尴尬的局面。
1 |
只要参数不超过64个,它都能很好的工作,而且在预处理阶段就能计算出参数的个数。
总结
我参考了大量其他人的写法,其中的基本原理大都是基于这两种思想。在C++中我还看到其它的解法,但是我目前还没有想到在C++中需要统计不定参数个数的地方。
1 |
|
应用
能够计算不定参数个数对于实现函数静态优化有一定意义,在代码中判断参数个数调用不同的函数实现,相当于实现了函数多态的一种特性。