我想表明不能用 C89 或 C90 中的長度變數來定義陣列。
我在 Windows 上使用來自 TDM GCC 的 GCC:
C:\TDM-GCC-64\bin> .\gcc.exe --version
gcc.exe (tdm64-1) 10.3.0
我的編譯選項是:
gcc.exe -Wall -g -ansi -save-temps -c
我試過了:
int main()
{
int i;
int tab[i];
tab[0] = 10;
return 0;
}
但它編譯得很好:
gcc.exe -Wall -g -ansi -save-temps -c main.c -o main.o
gcc.exe -o Sandbox.exe main.o
main.c:6:9: warning: variable 'tab' set but not used [-Wunused-but-set-variable]
6 | int tab[i];
| ^~~
main.c:6:5: warning: 'i' is used uninitialized in this function [-Wuninitialized]
6 | int tab[i];
| ^~~
Output file is bin\Debug\Sandbox.exe with size 196.89 KB
然后:
int test(int i)
{
int tab[i];
tab[0] = 10;
return 0;
}
也編譯:
main.c: In function 'test':
main.c:5:9: warning: variable 'tab' set but not used [-Wunused-but-set-variable]
5 | int tab[i];
| ^~~
Output file is bin\Debug\Sandbox.exe with size 196.90 KB
或者:
int main()
{
volatile int i;
int tab[i];
tab[0] = 10;
return 0;
}
只有這不是編譯:
int main()
{
// Comment
return 0;
}
error: C style comments are not allowed in ISO C90
我錯過了什么?謝謝!
uj5u.com熱心網友回復:
可變長度陣列是舊標準版本中的 GCC 擴展。擴展與標準“兼容”。如果您想完全遵守標準,即您想在使用擴展程式時收到一條訊息,請添加-pedantic選項(和-pedantic-errors錯誤)。
Gcc 檔案:https : //gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/Variable-Length.html#Variable-Length,https: //gcc.gnu.org/onlinedocs/gcc-12.2.0 /gcc/Warning-Options.html#Warning-Options。
uj5u.com熱心網友回復:
gcc 默認情況下具有草率的標準合規性。它默認為寬松的 C 一致性 GNU 擴展,相當于-std=gnu89(當前版本默認為-std=gnu17)。
當您鍵入-ansi時,它并不意味著符合模式,而是與-std=c89“lax C89 模式”完全相同。此編譯器選項可能會禁用某些 GNU 擴展...也許...同時保留其他擴展。與 gcc之間的區別-std=c89與-std=gnu89gcc 的其余部分一樣記錄不充分。我們可以閱讀不友好的手冊,它說:
例如,-std=c90 會關閉 GCC 的某些與 ISO C90 不兼容的特性,例如 asm 和 typeof 關鍵字,但不會關閉其他在 ISO C90 中沒有意義的 GNU 擴展
gcc 甚至在 C99 之前就支持可變長度陣列作為擴展,因此切換 GNU 選項應該禁用它們,但不是這樣......據我所知,沒有關于-std=c89關閉哪些功能的官方檔案,或者至少我沒有找不到。
重要的是要意識到-std=c89/-ansi單獨不會將gcc 推入符合模式!要做到這一點,你需要這樣做,-std=c89 -pedantic或者如果你愿意的話-std=c89 -pedantic-errors。之后,您將獲得如下診斷:
錯誤:ISO C90 禁止變長陣列“制表符”
并且當結合使用這兩個選項進行編譯時,gcc 可能具有最好的標準合規性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/512696.html
標籤:数组C海合会汇编c89
上一篇:在c中減去后提取數字
