[英]ISO C90 forbids mixing declarations and code... but allows it in certain instances?
我正在使用以下標志(其中 cc 是 gcc 4.2 或 clang 8.0):
$ cc -Wall -Werror -pedantic -ansi -std=c89 main.c
(我知道 -ansi 標志在這種情況下有點多余)
以下給了我預期的錯誤
main.c:31:8: warning: ISO C90 forbids mixing declarations and code [-Wdeclaration-after-statement]
vec3 abc = {0};
int main()
{
vec3 a = {0};
vec3 b = {0};
Vec3(2, 2, 2);
vec3 abc = {0}; // Declared after a function call
return 0;
}
然而,以下不
int main()
{
vec3 a = Vec3(0, 1, 2);
vec3 b = Vec3(0, 1, 2);
vec3 abc = {0}; // Declared after a function call
return 0;
}
當然用函數初始化變量仍然算作混合聲明和代碼?
Vec3 函數非常基礎; 沒有內聯標志集等
vec3 Vec3(float x, float y, float z)
{
vec3 rtn = {0};
rtn.x = x;
rtn.y = y;
rtn.z = z;
return rtn;
}
在此代碼段中
vec3 a = Vec3(0, 1, 2);
vec3 b = Vec3(0, 1, 2);
vec3 abc = {0}; // Declared after a function call
只有聲明。 沒有聲明。 用於初始化變量的函數調用是表達式。 它們不是陳述。
似乎這個警告
警告:ISO C90 禁止混合聲明和代碼
令人困惑。 這樣寫會更正確
警告:ISO C90 禁止混合聲明和聲明
例如,即使是多余的分號也會引入空語句。 所以通常編譯器應該發出警告,即使是下面的代碼片段
vec3 a = Vec3(0, 1, 2);;
^^^^
vec3 b = Vec3(0, 1, 2);
第二個函數具有三個帶有初始值設定項的連續變量定義——這不是問題。
C90 (C89) 不允許在語句之后聲明 — 在給定語句塊內( {
和}
之間),聲明必須全部位於任何語句(非聲明)之前。 一個普通的函數調用,不是初始化器的一部分,是一個語句。
這就是為什么用於報告問題的 GCC 選項是-Wdeclaration-after-statement
的原因。
你誤解了約束。 我們可以有帶有初始值設定項的聲明; 第一個非聲明語句標志着聲明的結束,在那之后我們不允許在該范圍內進行更多聲明。
非聲明語句可以是表達式語句(如上)、復合語句(例如if
或while
)或塊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.