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

來源:互聯網
上載者:User

去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只做簡單的宏替換,並不提供類型檢查.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.