為什么以下代碼編譯時沒有警告或錯誤?
#include <stdlib.h>
#include <string.h>
#ifdef __GNUC__
__attribute__((__const__))
#endif
int len(char** array) {
int i;
for (i = 0; array[i]; i );
return i;
}
void inner_len(char** array, int out[len(array)]) {
int i;
for (i = 0; i < len(array); i ) {
out[i] = strlen(array[i]);
}
}
int main() {
char* array[] = {
"hello",
"world",
NULL
};
int ilen[1];
inner_len(array, ilen);
}
尤其是函式宣告inner_len是最讓我困惑的地方。我已經看到 gcc 為錯誤的陣列長度提供警告。函式宣告中的運算式是否被忽略?
uj5u.com熱心網友回復:
您在這里所做的是宣告一個可變長度陣列。如果將其編譯為 ISO C89,您將獲得:
$ gcc --std c89 -pedantic -Wall bla.c
bla.c:9:1: warning: ISO C90 forbids variable length array ‘out’ [-Wvla]
9 | void inner_len(char** array, int out[len(array)]) {
| ^~~~
但作為 C99 沒有警告,因為 ISO C99 添加了可變長度陣列,請參閱例如https://en.wikipedia.org/wiki/Variable-length_array#C99。
請注意,out它仍然是一個普通指標,通常在 C 中,當您將陣列作為引數傳遞給函式時。而且這里也沒有編譯時間長度檢查,因為編譯器會運行/評估 function 中的代碼len(),而不是當你使用像int out[2].
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/523659.html
標籤:C海合会句法
