2013-06-04 83 views
1

我想用浮點類型定義一個值;更確切地說,用squareroot函數。
它應該看起來像這樣#define hyp sqrt(pow(50,2) + pow(50,2))
但是對於這個值,它 似乎不是恆定的,所以我有一些警告和類型衝突。
由於什麼原因它不是恆定的?
浮點數是否始終在運行時生成,編譯時是否爲整數?
或者這是衝突的,因爲sqrt聲明必須在函數的某個範圍內?初始值設定元素不是常量(sqrt函數)

[編輯] 更清楚: 的警告是東陽與定義的開方值#define P + hyp某些操作的 - 和我得到的警告。然後將P放入數組中,double arr_ps[] = {P,...}。沒有與整數沒有問題,只是與sqrt-值[/編輯]

@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

爲什麼你甚至用preprocesser呢?它應該只是一個常量或內聯函數。 –

+0

你能告訴你如何在代碼的其他地方使用'hyp'嗎? –

+0

你可以展示一個簡潔的,自給自足的代碼示例嗎?我試圖複製你的問題,不能這樣做。我嘗試了幾種不同的方式,並沒有從'gcc'中描述的那種警告。 – Simon

回答

5

第6.6條,該標準的第3段說

常量表達式不得含有賦值,遞增,遞減函數調用,或逗號經營者,當它們被包含未評估的子表達式中除。

常量表達式不得包含被評估的函數調用。

這是因爲

常量表達式可以平移,而不是在運行時間期間被評估,並且相應地,可以在該一個常數可以是任何地方被使用。

(第2段同上),並且函數調用可能無法在翻譯期間進行評估。

常量表達式 - 並且這種需要初始化靜態存儲持續時間的對象 - 你只能使用基本的算術運算,+-*/,和sizeof(但僅當結果是一個整數常量表達式)和_Alignof

算術常量表達式應具有算術類型和應僅具有操作數是整數常量,浮點常量,枚舉常數,字符常數,sizeof表達式,其結果是積分常數,並_Alignof表達式。算術常量表達式中的演員操作符只能將算術類型轉換爲算術類型,除了作爲操作數的一部分運算符sizeof_Alignof

術語「常量表達式」的技術含義比日常意義要窄得多。

+0

那麼什麼是gcc中的浮點常量?像Pi這樣的東西?還有更多,如何定義浮點常量? –

+0

您可以通過爲其分配一個數字而不是函數調用的結果來定義一個浮點常量:'const float x = 1.0f;'在您的情況下,您應該預先計算您的等式並插入該值。 –