選項-Wdeclaration-after-statement只是風格嗎?我的意思是,如果我對 C 代碼中定義了變數的所有情況進行宏處理,并以相同的方式在其中初始化它們,從這種較舊的 C90 樣式遷移到較新的 C99 樣式,那么該代碼會是位元組嗎? -byte一樣嗎?
以下是該選項-Wdeclaration-after-statement的記錄方式(來自man gcc):
在塊中的陳述句之后發現宣告時發出警告。這個結構,從 C 中知道,是在 ISO C99 中引入的,默認情況下在 GCC 中是允許的。ISO C90 不支持它。
它允許您使用類似的代碼
int a;
{
a = 42;
printf( "%d", a );
}
并把它變成
int a = 42;
printf( "%d", a );
這是我在這里提出的問題的后續行動。
uj5u.com熱心網友回復:
我可能在這里感到困惑,但我認為我們錯過了一些東西。
在 C99 之前,所有變數宣告都必須發生在塊中的任何陳述句之前。您在哪里為其分配值并不重要(可能在生成的匯編代碼中除外)。
int a;
do_something();
a = 7;
do_something_else();
什么,你不能這樣做在C,但一直是C 完全合法的是混合的宣告和說明:
do_something();
int a = 7;
do_something_else();
隨著 C99 的出現,您現在可以在 C 中做與在 C 中相同的事情,并在塊中的任何地方宣告一個變數,即使在非宣告陳述句之后也是如此。
最終,這是一個基于使撰寫泄漏到語言規范中的編譯器更容易的設計決策。編譯器現在有點復雜(而且更大)。
uj5u.com熱心網友回復:
在此背景關系中宣告或者指的是與結尾的充分表達;或可替代地一個復合陳述句,{ }。這些術語取自正式的 C 語法。
宣告后宣告不適用于您問題中的代碼。因為......你放在宣告前一個(復合)陳述句。您的兩個示例與此 gcc 設定無關,因此您似乎誤解了它的作用。
相反,相關的例子是:
{
int a = 42;
}
相對
{
puts("hello");
int a = 42;
}
前一個例子適用于任何 C 版本。后者在標準 C 中很好,但在已棄用的 C90 標準中則不然。因此,現在警告的唯一目的是為強制執行某種編碼風格的標準 C 程式提供診斷訊息。
絕大多數程式員不應該使用此警告并堅持 ISO 9899:2018 中定義的標準 C。
uj5u.com熱心網友回復:
不,這不對。例如,上面的兩個片段將逐位元組編譯相同。所以才會foo和bar下方,但baz不會。這是GodBolt的鏈接。這表明將初始化提升到宣告可能不會產生相同的代碼
void foo () {
int a;
{
if ( 1 ) {
a = 42;
printf( "%d", a );
}
else {
a = 42;
printf( "%d", a );
}
}
}
void bar () {
int a = 42;
{
if ( 1 ) {
printf( "%d", a );
}
else {
printf( "%d", a );
}
}
}
void baz () {
int a;
{
if ( rand() > 0 ) {
a = 42;
printf( "%d", a );
}
else {
a = 42;
printf( "%d", a );
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/341525.html
