#define num 7 \\ user can change this
#define size ???? \\I want this value (factorial of num) to be computed during compile time
int array[size][num];
#if num == 1
#define sum 1
#elif num == 2
#define sum 2
#elif num == 3
#define sum 6
#elif num == 4
#define sum 24
#elif num == 5
#define sum 120
#elif num == 6
#define sum 720
#elif num == 7
#define sum 5040
#elif num == 8
#define sum 40320
#elif num == 9
#define sum 362880
#else
#error wrong number
#endif
用途
#define num 7
#include "fc.h"
int array[sum][num];
3条答案
按热度按时间eoigrqb61#
在单独的.h文件(例如fc. h)中:
用途
kpbwa7wx2#
我通常编写一个简短的shell脚本来预先计算三元表达式的值。
ergxz8rk3#
您可以手动将
(x) * (((x)-1)>0?((x)-1):1) * (((x)-2)>0?((x)-2):1) ...
之类的内容放入宏中,您只需要进行几次迭代,因为阶乘增长非常快,并且支持的最大整数通常只有64位宽。虽然如上所示的表达式可能看起来很复杂,但对于整型常量表达式
x
(如1
、1+2
、sizeof(0)*3
),它保证生成整型常量表达式,即适合初始化静态数组大小、位字段大小和大小写标签的表达式。(例如1
、42u
、0x1000ull
),则表达式也是预处理器可识别的,即,适合作为#if
预处理器条件的自变量。那么你怎么能得到这样一个宏呢?
首先,你需要一个阶乘参数的上限,它不会溢出一个unsigned long long(预处理器和C编译器保证支持的最大值,通常为64位宽)。
你可以用一些
并且对于64位无符号长型long是22。
知道它是22,就可以生成宏:
上面的指纹
你可以测试这个宏是否有预处理器可以识别的整数:
对于预处理器无法识别的整型常量表达式: