首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 結構體數組在頭文件賦值報錯:僅支持聲明不支持賦值語句

     編輯:程式設計綜合問答

錯誤代碼


// 信息.h
struct students {
    long code;
    char *name;
    float score[3];
    float sum;
};

void default_initiate(struct students stu[]) {
    stu[0] = { 20140001, "陳龍", {50.0, 30.0, 89.0} }; // 報錯
}

原因

C 標準規定:頭文件(或全局作用域)僅允許聲明與初始化,不允許賦值語句。stu[0] = {...} 是賦值表達式,必須在函數體內執行。

解決方案

  1. 移至函數內部(推薦):
    
      void default_initiate(struct students stu[]) {
          stu[0].code = 20140001;
          stu[0].name = "陳龍";
          stu[0].score[0] = 50.0f;
          stu[0].score[1] = 30.0f;
          stu[0].score[2] = 89.0f;
          stu[0].sum = 0; // 後續計算
      }
      
  2. 使用靜態常量數組初始化(僅限全局/靜態存儲期):
    
      // .c 文件
      static const struct students default_stu = {
          20140001, "陳龍", {50.0f, 30.0f, 89.0f}, 0
      };
      void default_initiate(struct students stu[]) {
          stu[0] = default_stu; // 複製結構體
      }
      
  3. C99 指定初始化器(現代編譯器支持):
    
      stu[0] = (struct students){
          .code = 20140001,
          .name = "陳龍",
          .score = {50.0f, 30.0f, 89.0f}
      };
      

編譯器差異說明

VS2013/Dev-C++ (GCC) 對 C99 特性支持較好,允許復合字面量賦值;VC6.0/VS2008 僅支持 C89,故報錯。建議項目統一 C99 或 C11 標準(VS2019+ 默認支持)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved