首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C/C++ 全局變量正確使用指南:定義與聲明分離

     編輯:關於C語言

核心規則:一處定義,多處聲明

文件內容關鍵字
.c/.cpp(僅一個)定義並可選初始化無 / 直接類型
.h聲明extern
其他 .c/.cpp包含 .h 即可使用#include "xxx.h"

標準範例

global.h

#ifndef GLOBAL_H
#define GLOBAL_H

extern int g_configValue;        // 聲明,不初始化
extern const char* g_version;    // const 也需 extern
extern struct Config g_cfg;      // 結構體同理

#endif

global.c

#include "global.h"

int g_configValue = 42;              // 定義+初始化
const char* g_version = "1.0.0";
struct Config g_cfg = {0};           // 零初始化

main.c

#include "global.h"
#include <stdio.h>

int main() {
    printf("value=%d, ver=%s\n", g_configValue, g_version);
    g_configValue = 100; // 修改全局變量
    return 0;
}

常見錯誤與後果

  1. 在 .h 中定義:int g = 0; → 多文件包含導致重複定義鏈接錯誤。
  2. 在 .h 中 extern int g = 0;:C++ 允許但極易誤解,C 標準禁止,移植性差。
  3. 忘記 extern:.h 中寫 int g; → 每個編譯單元產生一個暫定定義,鏈接時可能合併也可能報錯(C99 行為不一)。
  4. 頭文件未防重複包含:缺 #ifndef/#define/#endif 或 #pragma once。

進階最佳實踐

  • 最小化全局狀態:能用函數參數/返回值/單例類/模塊靜態變量替代,就不用全局變量。
  • 封裝訪問函數:int GetConfigValue(); void SetConfigValue(int); 而非直接暴露變量,便於加鎖、日誌、驗證。
  • 命名規範:g_ 前綴區分局部變量,如 g_serverPort。
  • 常量優先:只讀全局用 const 或 constexpr(C++17 inline constexpr 可直接在 .h 定義)。
  • 線程安全:多線程讀寫需加鎖(pthread_mutex/std::mutex)或用原子類型(std::atomic)。

C++17 新選擇:inline 變量

// global.hpp (C++17)
inline int g_configValue = 42;        // 直接在頭文件定義,鏈接器自動去重
inline const char* g_version = "1.0.0";

無需 .cpp 文件,編譯器保證全程序僅有一個實體,極大簡化項目結構。

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