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

C 語言 extern 關鍵字:跨文件變量共享機制與常見誤區

     編輯:程式設計綜合問答

問題代碼分析

文件 1 (main.c):

extern int i, j;
int main() { i=1; j=2; return 0; }

文件 2 (other.c):

int i, j;  // 定義
int main1() { printf("%d\n", i+j); return 0; }

現象:運行文件 2 時無輸出。

核心誤區

C 程序入口唯一且固定為 main() 函數。

  • 編譯鏈接後,生成單一可執行文件,只有一個 main() 作為入口
  • 文件 2 中的 main1() 永遠不會被自動調用
  • 運行程序時,只執行 main() (文件 1),main1() 代碼雖在可執行文件中但從未執行

extern 正確機制

// file1.c
#include <stdio.h>
extern int g_val;  // 聲明:告訴編譯器 g_val 在別處定義
int main() {
    g_val = 100;
    print_val();   // 調用文件 2 的函數
    return 0;
}

// file2.c
#include <stdio.h>
int g_val = 0;     // 定義:分配內存,初始化
void print_val() {
    printf("g_val = %d\n", g_val); // 輸出 100
}

編譯鏈接:gcc file1.c file2.c -o prog

  • extern 告訴編譯器:符號在別的編譯單元定義
  • 鏈接器將聲明與定義匹配,解析地址
  • 運行時,main() 修改共享變量,print_val() 讀取修改後的值

常見錯誤對比

最佳實踐

// shared.h
#ifndef SHARED_H
#define SHARED_H
extern int g_counter;      // 聲明
void increment_counter();  // 函數聲明
#endif

// shared.c
#include "shared.h"
int g_counter = 0;         // 定義
void increment_counter() { g_counter++; }

// main.c
#include "shared.h"
int main() {
    increment_counter();
    printf("%d\n", g_counter); // 1
    return 0;
}

總結

extern 實現跨編譯單元變量/函數共享。核心規則:聲明多處,定義一處,單入口 main()。問題代碼誤以為多個 main 可並行運行,實為基本機制誤解。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
錯誤正確說明
多文件各寫 main()僅一個 main(),其他寫功能函數程序單入口
頭文件中 int g_val;頭文件 extern int g_val;,一個 .c 中定義避免重複定義
extern int g_val = 10; 在頭文件頭文件僅聲明,定義放 .c定義即分配存儲
以為 extern 會自動調用其他函數需顯式調用無魔法調用