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

C++ 結構體定義在頭文件中導致重定義錯誤的正確寫法

     編輯:程式設計疑難解答

在 C++ 中,若在頭文件中直接定義結構體並實例化全局對象,多個 .cpp 文件包含該頭文件時會導致「重定義符號」編譯錯誤。本文分析錯誤原因並給出規範解決方案。

錯誤代碼示例

// 錯誤的頭文件 myheader.h
sturct my()  // 拼寫錯誤:應為 struct
{
  int h;
  int hao[20];
  my()  // 構造函數寫法不當
  {
    h = 0;
  }
} uo;  // 直接在頭文件實例化全局對象 uo

錯誤原因

  1. 關鍵字拼寫錯誤:sturct 應為 struct。
  2. 結構體定義語法錯誤:結構體名後不應有括號 ()。
  3. 頭文件中定義全局實例:在頭文件中直接實例化對象 uo,導致每個包含該頭文件的編譯單元都產生一個 uo 符號,鏈接時發生重定義。

正確做法

1. 僅在頭文件中聲明結構體與外部變量

// myheader.h
#ifndef MYHEADER_H
#define MYHEADER_H

struct MyStruct {
  int h;
  int hao[20];
  MyStruct() : h(0) {}  // 正確的構造函數寫法
};

// 聲明外部變量,不定義
extern MyStruct uo;

#endif

2. 在一個 .cpp 文件中定義實例

// myheader.cpp
#include "myheader.h"

MyStruct uo;  // 這裡真正分配內存並定義符號

3. 其他 .cpp 文件正常包含頭文件使用

// main.cpp
#include "myheader.h"
#include <iostream>

int main() {
  uo.h = 10;
  std::cout << uo.h;
  return 0;
}

進階建議:使用 inline 變量

C++17 起,可在頭文件中使用 inline 關鍵字定義變量,避免重定義:

// myheader.h (C++17)
#ifndef MYHEADER_H
#define MYHEADER_H

struct MyStruct {
  int h;
  int hao[20];
  MyStruct() : h(0) {}
};

inline MyStruct uo;  // C++17 inline 變量,多文件包含不重複定義

#endif

總結

  • 頭文件只放聲明(類定義、extern 變量聲明、inline 變量)。
  • 定義(分配內存)放在唯一的 .cpp 文件中,或用 C++17 inline。
  • 注意關鍵字拼寫與語法規範。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved