#ifdef __cplusplus extern "C" { #endif 的解釋<轉>

#ifdef __cplusplus extern "C" { #endif 的解釋

做者:宋老師,華清遠見嵌入式學院講師。c++

一、在好多程序中咱們會遇到下面代碼段函數

#ifdef __cplusplus
        extern "C" {
        #endif編碼

//c語法代碼段spa

#ifdef __cplusplus
        }
        #endif //orm

首先應該知道,__cplusplus是CPP中的自定義宏,則表示這是一段cpp的代碼,編譯器按c++的方式編譯系統.。若是這時候咱們須要使用c語言的代碼,那麼就須要加上(extern "C" { )這一段來講明,要不編譯器會把c代碼按c++模式編譯,會出現問題。get

這句話的意思是:這個代碼是CPP的代碼,__cplusplus是cpp中的自定義宏,所以,以CPP語言的形式編譯,可是裏面的代碼有C語言的代碼,那麼就要「extern "C" { 」說明一下,編譯器用C語言的模式編譯。編譯器

#ifdef __cplusplus //c++編譯環境中才會定義__cplusplus (plus就是"+"的意思)
        extern"C"{  /告訴編譯器下面的函數是c語言函數(由於c++和c語言對函數的編譯轉換不同,主要是c++中存在重載)
        #endifit

要明白爲什麼使用extern "C"{,還得從CPP中對函數的重載處理開始提及。在c++中,爲了支持重載機制,在編譯生成的彙編碼中,要對函數的名字進行一些處理,加入好比函數的返回類型等等。而在C中,只是簡單的函數名字而已,不會加入其餘的信息。也就是說:C++和C對產生的函數名字的處理是不同的。 加上extern "C"{ 目的,就是主要實現C與C++的相互調用問題。io

extern "C"是鏈接申明(linkage declaration),被extern "C"修飾的變量和函數是按照C語言方式編譯和鏈接的。編譯

一、C++ 調用C中函數的實例:

c.h的實現

#ifndef _c_h_
        #define _c_h_

        #ifdef __cplusplus
        extern "C" {
                #endif

                void C_fun();

                #ifdef __cplusplus
        }
        #endif

        #endif
        -----------------------------------

c.c的實現

#include "c.h"
        void C_fun()
        {
        }

------------------------------------

在cxx.cpp中調用c.c中的C_fun()

cxx.cpp的實現

#include "c.h"
        int main()
        {
                C_fun()
        }

C++調用C的函數時,在c++的 .h 文件中加extern "C" {}。

因此關鍵是extern "C" {} ,extern "C"是告訴C++編譯器件括號裏的東東是按照C的obj文件格式編譯的,要鏈接的話按照C的命名規則去找。

二、C調用C++中的函數CPP_fun()

由於先有C後有C++,因此只能從C++的代碼中考慮了。加入C++中的函數或變量有可能被C中的文件掉用,則應該這樣寫,也是用extern "C"{},不過是代碼中要加,頭文件也要加,由於多是C++中也調用

Cxx.h的實現

#ifndef _c_h_
        #define _c_h_

        #ifdef __cplusplus
        extern "C" {
                #endif

                void CPP_fun();

                #ifdef __cplusplus
        }
        #endif

        #endif

Cxx.cpp的實現

extern "C" { //告訴C+++編譯器,擴號裏按照C的命名規則編譯
                void CPP_fun()
                {
                        .....
                }
        }

c.c的實現

#include "Cpp.h"
        int main()
        {
                CPP_fun()
        }

總結:C和C++對函數的處理方式是不一樣的.extern "C"是使C++可以調用C寫做的庫文件的一個手段,若是要對編譯器提示使用C的方式來處理函數的話,那麼就要使用extern "C"來講明。

相關文章
相關標籤/搜索