Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Redeclaration ของ Global Variable ใน C: ทำได้เมื่อไม่มี Initialization

ใน C Language Global Variable (External Linkage) สามารถ Redeclare (ประกาศซ้ำ) ได้หลายครั้ง ตราบใดที่ มีเพียงครั้งเดียวที่มี Initialization (Definition) นี่คือ Tentative Definition Rule

กฎ Tentative Definition

  • int a; → Tentative Definition (Declaration + Implicit Zero Initialization)
  • int a = 10; → Definition (Explicit Initialization)
  • หลาย Tentative Definitions → OK (รวมเป็นหนึ่ง Definition, Zero-initialized)
  • หลาย Definitions (มี Initializer) → Error: Redefinition

ตัวอย่างที่ทำงานได้

#include <stdio.h>

int a;        // Tentative Definition 1
int a;        // Tentative Definition 2 (OK)
int a = 50;   // Definition (Initializer) - Only One Allowed

int main() {
    printf("a = %d\n", a); // 50
    return 0;
}

ผลลัพธ์

a = 50

ตัวอย่างที่ Error


int a = 10;   // Definition 1
int a = 50;   // Definition 2 -> Error: Redefinition of 'a'

Error


error: redefinition of 'a'

Local Variables: ไม่สามารถ Redeclare ได้


void func() {
    int x;
    int x = 5; // Error: Redeclaration of 'x' with no linkage
}

Local Variables มี No Linkage -> ห้าม Redeclare ใน Scope เดียวกัน

Extern Declaration


// file1.c
int global_var = 42; // Definition

// file2.c
extern int global_var; // Declaration (ไม่ใช่ Definition)
// ใช้ global_var ได้

extern บอก Compiler ว่า Variable ถูก Define ที่อื่น (Translation Unit อื่น)

Static Global Variables (Internal Linkage)


// file1.c
static int file_local = 10; // Internal Linkage

// file2.c
static int file_local = 20; // OK: ตัวแปรคนละตัว (Scope จำกัดใน File)

Best Practices

  • ใช้ extern ใน Header File สำหรับ Global Variables
  • Define (Initialize) ใน หนึ่ง .c file เท่านั้น
  • หลีกเลี่ยง Global Variables ใช้ Namespace/Class/Module Pattern แทน
  • C++: inline Variables (C++17) แก้ปัญหา Multiple Definitions ใน Header

สรุป

C อนุญาต Multiple Tentative Definitions (int a;) ของ Global Variable แต่ Definition ที่มี Initializer (int a = 10;) ต้องมีเพียงครั้งเดียว** Local Variables ห้าม Redeclare ใน Scope เดียวกัน ใช้ extern สำหรับ Cross-file Declarations