簡體   English   中英

在編譯時評估哪些類型的表達式?

[英]What types of expressions are evaluated at compile time?

在編譯時評估哪些類型的表達式?

我遇到了這個問題,因為我正在學習條件編譯。 #if后面是條件編譯中的常量表達式,並且常量表達式應該在編譯時進行評估。 我想了解什么樣的表達式可以是常量表達式並且可以遵循#if

#if x>0 || defined(ABC) && defined(BCD)

這是對的,尤其是x>0嗎?

編寫一個完整且正確的答案並非易事,因為很多東西都是在 C 的編譯時計算的。 要回答這個問題,需要深入了解 C 標准,其中包含許多內部使用的“語言律師”術語。


首先是翻譯階段(C17 5.1.1.2)中描述的整個預處理部分。 例如,在這些預處理翻譯階段中包括#if指令,它的正式語法如下:

# if常量表達式換行

其中常量表達式是始終在編譯時評估的表達式的另一個術語。 C 在 C17 6.6 中定義了這樣的表達式:

常量表達式可以在翻譯期間而不是運行時進行評估,因此可以在常量可能存在的任何地方使用。

約束
常量表達式不應包含賦值、遞增、遞減、函數調用或逗號運算符,除非它們包含在未計算的子表達式中。

每個常量表達式都應計算為一個常量,該常量在其類型的可表示值范圍內。

然后它將常量表達式分類為以下類型:

  • Integer 常量表達式

    An integer constant expression shall have integer type and shall only have operands that are integer constants, enumeration constants, character constants, sizeof expressions whose results are integer constants, _Alignof expressions, and floating constants that are the immediate operands of casts. integer 常量表達式中的強制轉換運算符只能將算術類型轉換為 integer 類型,除非作為sizeof_Alignof運算符的操作數的一部分。

  • 算術常數表達式

    與上述幾乎相同的定義,除了它還允許浮點類型。 所以一個 integer 常量表達式也是一個算術常量表達式。 (C中的算術類型都是integer和所有浮點類型。)

  • 地址常數

    An address constant is a null pointer, a pointer to an lvalue designating an object of static storage duration, or a pointer to a function designator; 它應使用一元&運算符或轉換為指針類型的 integer 常量顯式創建,或通過使用數組表達式或 function 類型隱式創建。 數組下標[]和成員訪問. ->運算符、地址&和間接*一元運算符以及指針轉換可用於創建地址常量,但不得使用這些運算符訪問 object 的值。

  • 實現定義的 forms(特定於編譯器的語言擴展)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM