簡體   English   中英

C99 VLA尺寸確定和尺寸操作員

[英]C99 VLA size determination and sizeof operator

我寫了以下內容作為回答有關sizeof及其關於C99 VLA的行為的問題的一部分:

be difficult to create a readable, easily understandable/maintainable, and useful case (I haven't tried to). 有意創建一個案例,其中count_of的語義對於VLA count_of會有所不同,但很難創建一個可讀,易於理解/可維護且有用的案例(我沒有嘗試過)。

在考慮了這個之后,我不確定這個陳述是否真的如此。 要首先創建VLA,編譯器必須首先確定VLA所需的空間量。

對於sizeof ,我們知道

如果操作數的類型是可變長度數組類型,則計算操作數; 否則,不評估操作數,結果是整數常量。 (6.5.3.4/2)

雖然VLA大小顯然是運行時確定,但在評估VLA聲明符的大小表達式后(如果有的話,包括任何副作用):

可變長度數組類型的每個實例的大小在其生命周期中不會改變。 如果size表達式是sizeof運算符的操作數的一部分,並且更改size表達式的值不會影響運算符的結果,則無法指定是否計算size表達式。 (6.7.5.2/2)

所以,給定

#define count_of(arr)  (sizeof(arr)/sizeof(arr[0]))

case where the actual effective behavior of a macro such as this could differ for a VLA vs. an array declaration where the array-size expression is a constant expression (ie a plain-old pre-C99 fixed-size array)? 像這樣的宏的實際有效行為,對於VLA而不是數組大小表達式是一個常量表達式(即一個普通的C99前固定大小數組)的數組聲明?

顯而易見的答案是,當arr是包含副作用的表達式時。 如果評估sizeof的參數,則會產生副作用。 如果沒有評估,則沒有副作用。

#include <stdio.h>
#define LENGTHOF(arr) (sizeof(arr) / sizeof(*(arr)))
void f() {
  puts("f");
}
int main() {
  const int n = 4;
  int array[n];
  return LENGTHOF(*(f(), &array)) - 4;
}

這在C99中有效,其中array是VLA,在C ++中, n是常量表達式,而array不是VLA。 在C99中,這打印f 在C ++中,這不會打印任何內容。

暫無
暫無

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

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