我想用float类型定义一个值;更确切地说,具有squareroot功能。
它应该看起来像这样#define hyp sqrt(pow(50,2) + pow(50,2))
。
但是对于这个价值而言
似乎不是常数,所以我有一些警告和类型冲突。
由于什么原因它不是恒定的?
是否始终在运行时生成浮点数,并在编译时生成所有整数?
或者这是冲突的,因为sqrt声明必须在函数的某个范围内?
[编辑]
更清楚:
警告是由于某些操作与定义的sqrt值#define P + hyp
- 并为此我收到警告。然后将P放入数组double arr_ps[] = {P,...}
。整数没有问题,只有sqrt值。[/ edit]
@Simon
我有一个头文件points.h:
#define x 10
#define y 10
#define distance 100
#define P1x x
#define P1y y
#define hyp sqrt(pow(50,2) + pow(50,2))
#define P1x_new P1x + distance
#define P1y_new P1y + hyp
然后我有c文件:
#include "points.h"
double arr_x[2]={P1x,P1x_new};
double arr_y[2]={P1y,P1y_new};
main(){
printf("Px: %f, Py: %f \n",arr_x[0],arr_y[0]);
printf("Px_new: %f, Py_new: %f \n", arr_x[1],arr_y[1]);
}
警告:initializer element is not constant (near initialization for 'arr_y')
- 我得到其中三个。
答案 0 :(得分:5)
该标准第6.6条第3款
常量表达式不应包含赋值,递增,递减,函数调用或逗号运算符,除非它们包含在未评估的子表达式中。
常量表达式不得包含已计算的函数调用。
那是因为
常量表达式可以在转换期间而不是运行时进行评估,因此可以在常量可能的任何位置使用。
(第2段同上),在翻译过程中可能无法评估函数调用。
在常量表达式中 - 需要初始化静态存储持续时间的对象 - 您只能使用基本算术+-*/
和sizeof
(但仅限于结果是一个整数常量表达式)和_Alignof
:
算术常量表达式应具有算术类型,并且只能具有整数常量,浮点常量,枚举常量,字符常量,结果为整数常量的
sizeof
表达式和_Alignof
表达式的操作数。算术常量表达式中的转换运算符只能将算术类型转换为算术类型,除非作为sizeof
或_Alignof
运算符的操作数的一部分。
“恒定表达”一词的技术含义比日常意义要窄得多。