1. 程式人生 > >const對象僅在文件內有效

const對象僅在文件內有效

extern 必須 編譯 不同 fin clas col div cpp

  當以編譯時初始化的方式定義一個const對象時,編譯器將在編譯的過程中把用到該變量的地方都替換成對應的值。為了執行替換,編譯器必須知道變量的初始值。如果程序包含多個文件,則每個用了const對象的文件都必須得能訪問到它的初始值才行。要做到這一點,就必須在每一個用到變量的文件中都有對它的定義。為了支持這一用法,同時避免對同一變量的重復定義,默認情況下,const對象被設定為僅在文件內有效。當多個文件中出現了同名的const變量時,其實等同於在不同文件中分別定義了獨立的變量。

例子:

技術分享圖片

1 // file_1.h
2 #ifndef FILE_1
3 #define FILE_1
4 void
f(); 5 #endif

1 // func.cpp
2 #include <file_1.h>
3 #include <iostream>
4 
5 const int x = 998;
6 void f()
7 {
8     std::cout << "func:&x " << &x << std::endl;
9 }

 1 // main.cpp
 2 #include <iostream>
 3 #include <string>
 4 #include <file_1.h>
 5
6 const int x = 998; 7 int main() 8 { 9 f(); 10 std::cout << "main:&x: "<<&x << std::endl; 11 return 0; 12 }

輸出:

技術分享圖片

x的地址完全不一樣,說明2個x變量時獨立的,不是同一個。

  如果想要在不同的文件間共享同一個const變量怎麽辦,方法是對於const變量不管是聲明還是定義都添加extern關鍵字,這樣只需定義一次就好了。

例子:

技術分享圖片

1 // file_1.h
2 #ifndef FILE_1
3 #define FILE_1 4 extern const int x; 5 void f(); 6 #endif

1 // func.cpp
2 #include <file_1.h>
3 #include <iostream>
4 
5 extern const int x = 998;
6 void f()
7 {
8     std::cout << "func:&x " << &x << std::endl;
9 }

 1 // main.cpp
 2 #include <iostream>
 3 #include <string>
 4 #include <file_1.h>
 5 
 6 extern const int x;
 7 int main()
 8 {
 9     f();
10     std::cout << "main:&x: "<<&x << std::endl;
11     return 0;
12 }

輸出:

技術分享圖片

地址一樣,說明是同一個變量

const對象僅在文件內有效