Gcc 初始值设定项元素不是常量(sqrt函数)

Gcc 初始值设定项元素不是常量(sqrt函数),gcc,Gcc,我想用float类型定义一个值;更确切地说,是平方根函数。 它应该像这样定义hyp sqrtpow50,2+pow50,2。但对于这个值来说 似乎不是常量,所以我有一些警告和类型冲突。为什么它不是常数? 是否总是在运行时生成浮点数,并在编译时生成所有整数? 或者这是因为sqrt声明必须在函数的某个范围内,所以相互冲突 [编辑] 更清楚地说: 这些警告是由于使用定义的sqrt值define P+hyp执行某些操作造成的,因此我得到了警告。然后将P放入一个数组,双arr_ps[]={P,…}。整数没

我想用float类型定义一个值;更确切地说,是平方根函数。 它应该像这样定义hyp sqrtpow50,2+pow50,2。但对于这个值来说 似乎不是常量,所以我有一些警告和类型冲突。为什么它不是常数? 是否总是在运行时生成浮点数,并在编译时生成所有整数? 或者这是因为sqrt声明必须在函数的某个范围内,所以相互冲突

[编辑] 更清楚地说: 这些警告是由于使用定义的sqrt值define P+hyp执行某些操作造成的,因此我得到了警告。然后将P放入一个数组,双arr_ps[]={P,…}。整数没有问题,只要使用sqrt-value即可。[/edit]

@西蒙 我有一个头文件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]);

}

警告:在“arr_y”的初始化附近,初始值设定项元素不是常量,我得到了其中三个元素。

本标准第3段第6.6条规定

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

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

那是因为

常量表达式可以在转换过程中而不是在运行时进行计算,因此可以在常量所在的任何位置使用

第2段同上,在翻译过程中可能无法评估函数调用

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

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


“常量表达式”一词的技术含义比日常意义窄得多。

本标准第6.6条第3款规定

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

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

那是因为

常量表达式可以在转换过程中而不是在运行时进行计算,因此可以在常量所在的任何位置使用

第2段同上,在翻译过程中可能无法评估函数调用

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

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


常量表达式这一术语的技术含义比日常意义要狭窄得多。

为什么要使用预处理器来实现这一点?它可能只是一个常量或一个内联函数。你能展示一下你在代码中其他地方是如何使用hyp的吗?你能展示一个简洁、自包含的代码示例吗?我试图复制您的问题,但无法复制。我尝试了几种不同的方法,但没有收到您从gcc描述的那种警告。@PaulR:我知道,这不是正确的使用,只是出于测试的原因;问题是:当定义的值是整数时,编译器如何处理它们,当它们不是整数时,编译器如何处理它们。你为什么还要为此使用预处理器?它可能只是一个常量或一个内联函数。你能展示一下你在代码中其他地方是如何使用hyp的吗?你能展示一个简洁、自包含的代码示例吗?我试图复制您的问题,但无法复制。我尝试了几种不同的方法,但没有收到您从gcc描述的那种警告。@PaulR:我知道,这不是正确的使用,只是出于测试的原因;关键是:编译器如何处理定义的值,当它们是整数时,以及当它们不是整数时,如何处理。那么gcc中的浮点常量是什么?比如圆周率?更重要的是,如何定义浮动常量
通过指定一个数字而不是函数调用的结果来细化浮点常量:const float x=1.0f;在你的例子中,你应该预先计算你的方程并插入值。那么gcc中的浮动常数是什么?比如圆周率?更重要的是,如何定义浮点常量?通过给浮点常量赋值而不是函数调用的结果来定义它:const float x=1.0f;在您的情况下,您应该预先计算公式并插入值。