初始化元素不是常量(sqrt函数)

k t*_*k t 1 gcc

我想用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
Run Code Online (Sandbox Code Playgroud)

然后我有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]);

}
Run Code Online (Sandbox Code Playgroud)

警告:initializer element is not constant (near initialization for 'arr_y')- 我得到其中三个.

Dan*_*her 5

该标准第6.6条第3款规定

常量表达式不应包含赋值,递增,递减,函数调用或逗号运算符,除非它们包含在未评估的子表达式中.

常量表达式不得包含已计算的函数调用.

那是因为

可以在转换期间而不是运行时期间评估常量表达式,并且因此可以在常量可以在任何地方使用.

(第2段同上),在翻译期间可能无法评估函数调用.

常量表达式中 - 需要初始化静态存储持续时间的对象 - 您只能使用基本算术+-*/,和sizeof(但仅当结果是整数常量表达式时)和_Alignof:

算术常量表达式应具有算术类型,并且只能具有整数常量,浮点常量,枚举常量,字符常量,sizeof结果为整数常量的_Alignof表达式和表达式的操作数.算术常量表达式中的转换运算符只能将算术类型转换为算术类型,除非作为操作符sizeof_Alignof操作符的一部分.

术语"恒定表达"具有比日常意义更窄的技术含义.