บทความนี้เปรียบเทียบพฤติกรรมของ C และ C++ เมื่อ Redeclare (ประกาศซ้ำ) ตัวแปร Global และ Local ในกรณีต่างๆ: ไม่มี Initialization, มี Initialization, และ Initialize ซ้ำ
1. Global Variable - ไม่มี Initialization
A) C Program
#include <stdio.h>
int var;
int var;
int main() {
printf("Var = %d", var);
return 0;
}
Output: Var = 0 (C อนุญาต ให้ประกาศซ้ำได้ ค่าเริ่มต้นเป็น 0)
B) C++ Program
#include <iostream>
using namespace std;
int var;
int var;
int main() {
cout << "Var = " << var;
return 0;
}
Output: Compilation Error: redeclaration of 'int var' (C++ ห้ามประกาศซ้ำ)
สรุป: C อนุญาต tentative definition หลายครั้ง C++ ห้าม
2. Local Variable - ไม่มี Initialization
A) C Program
#include <stdio.h>
int main() {
int var;
int var;
printf("Var = %d", var);
return 0;
}
Output: error: redeclaration of 'var' with no linkage
B) C++ Program
#include <iostream>
using namespace std;
int main() {
int var;
int var;
cout << "Var = " << var;
return 0;
}
Output: error: redeclaration of 'int var'
สรุป: C และ C++ ห้ามประกาศตัวแปร Local ซ้ำใน Scope เดียวกัน
3. Global Variable - มี Initialization
A) C Program (ประกาศครั้งแรกไม่ init ครั้งที่สอง init)
#include <stdio.h>
int main() {
int var;
int var = 10;
printf("Var = %d", var);
return 0;
}
Output: Var = 10 (C อนุญาตถ้าครั้งแรกไม่ได้ init)
B) C++ Program
#include <iostream>
using namespace std;
int var;
int var = 10;
int main() {
cout << "Var = " << var;
return 0;
}
Output: Compilation Error: redeclaration of 'int var'
สรุป: C อนุญาตถ้า declaration แรกเป็น tentative (ไม่ init) C++ ห้ามทุกกรณี
4. Global Variable - Initialize ทั้งสองครั้ง
A) C Program
#include <stdio.h>
int var;
int var = 10;
int main() {
printf("Var = %d", var);
return 0;
}
Output: error: redeclaration of 'var' with no linkage (C ห้ามถ้า init ทั้งคู่)
B) C++ Program (Local Variable Initialize ทั้งคู่)
#include <iostream>
using namespace std;
int main() {
int var;
int var = 10;
cout << "Var = " << var;
return 0;
}
Output: error: redeclaration of 'int var'
สรุป: C และ C++ ห้าม Initialize ตัวแปรซ้ำใน Scope เดียวกัน
ตารางสรุป
| สถานการณ์ | C | C++ |
|---|---|---|
| Global ไม่ init (หลายครั้ง) | ✅ OK | ❌ Error |
| Local ไม่ init | ❌ Error | ❌ Error |
| Global init ครั้งเดียว (ครั้งแรกไม่ init) | ✅ OK | ❌ Error |
| Global init ทั้งคู่ | ❌ Error | ❌ Error |
| Local init ทั้งคู่ | ❌ Error | ❌ Error |