c++中const與c語言當中的區別zz

去Intel面試的同學說面試官考了這個問題,一時真不知道,只好問度娘了。看來C的基礎還是很薄弱了,枉我還敢寫精通C語言。。。

轉自:http://qin8.blog.163.com/blog/static/189699090200992034421125/

C++中的const正常情況下是看成編譯期的常量,編譯器並不爲const分配空間,只是在編譯的時候將期值保存在名字表中,並在適當的時候摺合在代碼中.所以,以下代碼:

#include <iostream>
using namespace std;
int main()
{
 const int a = 1;
 const int b = 2;
 int array[ a + b ] = {0};
 for (int i = 0; i < sizeof array / sizeof *array; i++)
 {
        cout << array << endl;
 }
}
在可以通過編譯,並且正常運行.但稍加修改後,放在C編譯器中,便會出現錯誤:
#include <stdio.h>
int main()
{
 int i;
 const int a = 1;
 const int b = 2;
 int array[ a + b ] = {0};
 for (i = 0; i < sizeof array / sizeof *array; i++)
 {
        printf("%d",array);
 }
}
錯誤消息:
c:\test1\te.c(8): error C2057: 應輸入常數表達式
c:\test1\te.c(8): error C2466: 不能分配常數大小爲 0 的數組
出現這種情況的原因是:
在C中,const是一個不能被改變的普通變量,既然是變量,就要佔用存儲空間,所以編譯器不知道編譯時的值.而且,數組定義時的下標必須爲常量.
在C語言中:
const int size;
這個語句是正確的,因爲它被C編譯器看作一個聲明,指明在別的地方分配存儲空間.但在C++中這樣寫是不正確的.C++中const默認是內部連接,如果想在C++中達到以上的效果,必須要用extern關鍵字. 
C++中,const默認使用內部連接.而C中使用外部連接.
內連接:編譯器只對正被編譯的文件創建存儲空間,別的文件可以使用相同的表示符
      或全局變量.C/C++中內連接使用static關鍵字指定.
外連接:所有被編譯過的文件創建一片單獨存儲空間.一旦空間被創建,連接器必須解
      決對這片存儲空間的引用.全局變量和函數使用外部連接.通過extern關鍵
      字聲明,可以從其他文件訪問相應的變量和函數.
************************C++代碼******************************
header.h
const int test = 1;
test1.cpp
#include <iostream>
#include "header.h"
using namespace std;
int main()
{
 cout << "in test1 :" << test << endl;
}
test2.cpp
#include <iostream>
#include "header.h"
using namespace std;
void print()
{
 cout << "in test2:" << test << endl;    
}
以上代碼編譯連接完全不會出問題,但如果把header.h改爲:
extern const int test = 1;
在連接的時候,便會出現以下錯誤信息:
test2 error LNK2005: "int const test" (?test@@3HB) 已經在 test1.obj 中定義
因爲extern關鍵字告訴C++編譯器test會在其他地方引用,所以,C++編譯器就會爲test創建存儲空間,不再是簡單的存儲在名字表裏面.所以,當兩個文件同時包含header.h的時候,會發生名字上的衝突.
此種情況和C中const含義相似:
header.h
const int test = 1;
test1.c
#include <stdio.h>
#include "header.h"
int main()
{
 printf("in test1:%d\n",test);
}
test2.c
#include <stdio.h>
#include "header.h"
void print()
{
 printf("in test2:%d\n",test);    
}
錯誤消息:
test3 fatal error LNK1169: 找到一個或多個多重定義的符號
test3 error LNK2005: _test 已經在 test1.obj 中定義 
C++中,是否爲const分配空間要看具體情況.
如果加上關鍵字extern或者取const變量地址,則編譯器就要爲const分配存儲空間. 
C++中定義常量的時候不再採用define,因爲define只做簡單的宏替換,並不提供類型檢查.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章