天天看點

C++中extern的使用

C++中extern的用法時間:2011-02-21 08:35:19來源:網絡整理 作者:未知 點選:125次

來自:http://edu.codepub.com/2011/0221/29515.php

1. 聲明外部實體

聲明外部全局變量或對象,一般用于頭檔案中,表示在其它編譯單元内定義的變量,連結時進行外部連結,如: 

1. 聲明外部實體

聲明外部全局變量或對象,一般用于頭檔案中,表示在其它編譯單元内定義的變量,連結時進行外部連結,如:

extern int ivalue;

此時的extern是必須的,省略了extern編譯器将視為定義而不是聲明,一般地在源代碼中定義變量并進行初始化,在頭檔案中使用extern聲明變量。

類似地用于聲明外部全局函數,表示該函數在其它編譯單元中定義,如:

extern void func( void );

此時的extern可以省略。

2. 聲明函數的編譯和連結方式

extern 後可以跟”C”或”C++”用于聲明全局函數的編譯和連結方式,例如:

extern “C” void add( int a, int b);

extern “C++” void sum(int* ia, int leng);

void sum(int* ia, int leng);

其中的extern “C++”可以省略,它是在C++中預設的連結方式,即後面兩種聲明方式是等效的。這種聲明有兩種含義:首先,聲明這些函數使用外部連結方式,其實作不在本編譯單元之内;另一種含義,則是告訴編譯器編譯方式,如extern “C”則是告訴編譯器使用C語言的編譯方式編譯該函數。

C++支援函數重載,是以參數不同在編譯後生成的函數名也不同,如:

int max(int a, int b);

int max(float a, float b);

在編譯時生成的函數名可能分别為_max_int_int、_max_float_float,通過在函數名後加上參數類型來區分不同的函數,如果使用C語言方式,則生成的函數名中不包含參數資訊,隻生成_max,是以無法實作重載,也就是說在extern “C”中不能出現函數名重載,例如:

extern “C”{

int max(int a, int b);

int max(float a, float b);

}

非法,編譯器将報錯。而C++标準中并沒有定義extern “C”與extern “C++”的具體實作方式,不同編譯器生成的符号規則可能不同。

需要注意的是,如果函數聲明使用了extern “C”,則函數定義必須使用C編譯器編譯,或者使用extern “C”來修改函數的編譯方式,一般地将extern “C”聲明的函數的定義所在的源程式擴充名使用.c即可,而C++代碼放在.cpp檔案中。如果将extern “C”聲明的函數實作也放在.cpp中,則需要使用extern “C”來聲明函數編譯方式,例如:

extern “C” {

int max( int a, int b) { return a > b ? a : b; }

}

隻有在C++中使用C語言的庫或者兩種語言混合程式設計的時候才會用到extern “C”,而在C語言中是不支援extern “C”的,是以為了頭檔案通用,需要使用宏來控制,例如:

#ifndef MAX_H // 防止重複引用

#define MAX_H

#ifdef __cplusplus

extern "C" {

#endif

int max (int a, int b);

#ifdef __cplusplus

}

#endif

#endif

其中__cplusplus為C++定義的宏,凡是C++的編譯器都定義了該預編譯宏,通過它來檢測目前編譯器是否使用的是C++編譯器。

本篇文章來源于:開發學院 http://edu.codepub.com   原文連結:http://edu.codepub.com/2011/0221/29515.php