ใน 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++:
inlineVariables (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