我有构建时数组: const float my_array = {blah,blah,PROXIMITY_WIDTH_PIXELS,blah, blah,PROXIMITY_WIDTH_PIXELS * 10.0,blah};
我得到错误“初始化程序不是常量”:
#define PROXIMITY_OBJECT_SIZE_PIXELS <a constant value>
#define PROXIMITY_WIDTH_PIXELS( sqrt( PROXIMITY_OBJECT_SIZE_PIXELS ))
如何在'C'常量(构建时)数组或#define宏中的构建时计算平方根?
答案 0 :(得分:0)
只使用C预处理器而不使用其他代码生成技巧,你不能。
最简单的解决方案是使用double
类型的全局变量,该变量在使用前初始化。不幸的是,编译器不能被告知这是const
,所以它可能会产生比你想要的更多的变量访问,这可能或不重要。
如果您使用C ++,则可以执行以下操作:
// function calls allowed in file scope initializers!
const double proximity_width_pixels = sqrt(PROXIMITY_OBJECT_SIZE_PIXELS);
“代码生成技巧”是指在构建时运行脚本(甚至是为构建机器编译的C程序)时生成一个头文件,在其中插入浮点常量。
答案 1 :(得分:0)
如果PROXIMITY OBJECT SIZE宏总是采用两个或三个已知值中的一个,那么您可以根据具体情况定义PROXIMITY WIDTH PIXELS宏。
答案 2 :(得分:0)
sqrt
是一个函数,因此它是&#39;结果不是恒定的。您可以使用像autoconf这样的工具(或者通过编译一个使用常量PROXIMITY_OBJECT_SIZE_PIXELS
的简单类来生成您可以包含的头文件来创建自己的工具)。这是使用自举来解决鸡和蛋问题的一个例子。我建议您查看一些可能的替代方案Bootstrapping (Compilers)。