1

我想定义一个浮点类型的值;更准确地说,使用平方根函数。
它应该看起来像这样#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')- 我得到了三个。

4

1 回答 1

5

标准第 3 条第 6.6 条说

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

常量表达式不能包含被评估的函数调用。

那是因为

常量表达式可以在翻译期间而不是运行时进行评估,因此可以在常量可能存在的任何地方使用。

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

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

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

术语“常量表达式”具有比日常含义窄得多的技术含义。

于 2013-06-04T23:18:20.677 回答