如何让gcc将包含函数调用的表达式识别为常量?

时间:2012-03-06 22:51:55

标签: c function gcc const

gcc不喜欢以下代码:

inline const plus(unsigned x,unsigned y) __attribute__((pure));
inline const plus(unsigned x,unsigned y) { return x+y; }

int arr[plus(1,1)];

它会抛出以下错误:

error: variably modified ‘arr’ at file scope

唯一的事情是,我已经做了我能想到的一切,告诉gcc它可以优化对加号(a,b)到“a + b”的调用,并且我只传递了常量,所以结果应该不变!

我错过了让这项工作的东西吗?或者gcc不是那么聪明吗?

顺便说一句,使用plus(1,1)而不是1 + 1的原因是它使用宏来实现更通用的数组大小构造。

2 个答案:

答案 0 :(得分:2)

可能有gcc扩展允许这样的东西,但至少在标准C中,函数调用永远不会被计为常量表达式,无论你添加了多少const,或者它实际上是多么常量。您可能不得不使用宏来代替:

#define plus(x, y) ((x)+(y))

答案 1 :(得分:1)

据我所知,即使在调用main()之前,arr[]的内存逻辑已分配,并且所有静态变量的初始化都保证完成,并且编译器不是't(允许)足够聪明,可以在初始化所有静态之前确定你所引用的函数是否可以安全地调用。

换句话说,唯一的方法是(正如Thomas在他的回答中所做的那样)使用一个#define宏,它在编译时被评估为常量2