簡體   English   中英

ISO C90 禁止混合聲明和代碼……但在某些情況下允許這樣做?

[英]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的原因。

你誤解了約束。 我們可以有帶有初始值設定項的聲明; 第一個非聲明語句標志着聲明的結束,在那之后我們不允許在該范圍內進行更多聲明。

非聲明語句可以是表達式語句(如上)、復合語句(例如ifwhile )或塊。

暫無
暫無

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

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