extern "c"{}

在C++中,有一個extern “c”{} 的用法,主要爲了與C兼容。


C++中,編譯器爲處理同名函數的符號鏈接問題,一般會自己定義一套符號命名規則,如:

void func(int);

可能在編譯後被命名成這樣:

_void_func_int

當然,上面只是我自己弄的……,實際的編譯器有自己的規則,但是在C語言的鏈接庫中,符號名是已經確定了的,如:

void * memset(void *, int, size_t);

其符號名就是memset,如果使用C++編譯器,經實際的符號處理後(每個編譯器都不一樣,這裏是假設有這麼一個編譯器),可能變成:

_void_memset_void_int_size_t

這樣在鏈接的時候,就無法在C語言的庫中找到相應的函數入口地址。
於是extern “c”{} 出來了,它告訴C++編譯器,此 {} 中的符號不要經過編譯器的符號處理,所以在C語言的頭文件中,爲了在C++能繼續使用這些函數,需要對相應聲明函數作如下處理:

extern "c" 
{
    void * memset(void *, int, size_t);
}

但是還有一個問題,就是C語言不支持extern “c”{} 語法,於是又爲了兼顧C與C++,採用了預處理的方法,在C語言中,則不加extern “c” {} ,在C++中,則加上extern “c”{} :

#ifdef __cplusplus//若在C++中
extern "c"
{
#endif

    void * memset(void *, int, size_t);

#ifdef __cplusplus
}
#endif

先將目前的認識記下來吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章