嵌入式開發程式碼中的extern "C" {的作用

u010608626發表於2014-04-22

1、在好多程式中我們會遇到下面程式碼段

#ifdef __cplusplus
        extern "C" {
        #endif

//c語法程式碼段

#ifdef __cplusplus
        }
        #endif //

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

這句話的意思是:這個程式碼是CPP的程式碼,__cplusplus是cpp中的自定義巨集,因此,以CPP語言的形式編譯,但是裡面的程式碼有C語言的程式碼,那麼就要“extern "C" { ”說明一下,編譯器用C語言的模式編譯。

#ifdef __cplusplus //c++編譯環境中才會定義__cplusplus (plus就是"+"的意思)
        extern"C"{ /告訴編譯器下面的函式是c語言函式(因為c++和c語言對函式的編譯轉換不一樣,主要是c++中存在過載)
        #endif

要明白為何使用extern "C"{,還得從CPP中對函式的過載處理開始說起。在c++中,為了支援過載機制,在編譯生成的彙編碼中,要對函式的名字進行一些處理,加入比如函式的返回型別等等。而在C中,只是簡單的函式名字而已,不會加入其他的資訊。也就是說:C++和C對產生的函式名字的處理是不一樣的。 加上extern "C"{ 目的,就是主要實現C與C++的相互呼叫問題。

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

1、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的命名規則去找。

2、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"來說明。

相關文章