我未能使用error: conflicting declaration of C functionif 封閉#ifdef __cplusplus塊的錯誤訊息定義多載函式。
下面是一個簡單的代碼,便于查看。這段代碼在沒有#ifdef __cplusplus塊的情況下運行良好。
但是,我的專案代碼確實需要#ifdef __cplusplus,因為它涉及 C 和 C 代碼的組合。
塊后面的命令列#ifdef __cplusplus應該是C ,為什么沒有定義多載函式?如何解決存在#ifdef __cplusplus塊的問題?
#include <iostream>
using namespace std;
#ifdef __cplusplus
extern "C"
{
#endif
int add(int x)
{
return x;
}
int add(int x, int y)
{
return x y;
}
int main() {
// cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
int X = add(2);
int Z = add(8,2);
cout <<X<<" "<<Z<<endl;
return 0;
}
#ifdef __cplusplus
}
#endif
uj5u.com熱心網友回復:
#ifdef __cplusplus 塊之后的命令列應該是 C
首先,我相信你有一個誤解#ifdef __cplusplus,這個宏只檢查你的編譯器是否是 C 編譯器。
你更需要專注于extern "C" {}. 此代碼塊明確告訴您的編譯器,此代碼塊內的代碼必須是 C 語言(而不是 C )。
這很重要,因為 C 和 C 具有不同的存盤和呼叫二進制函式的機制。(稱為名稱修飾)。更好的說法是,C 和 C 二進制檔案不兼容。所以extern "C"會告訴你的編譯器你的函式是 C 代碼,并且這些函式名沒有被破壞。
所以#ifdef __cplusplus檢查你的代碼是C還是C ;如果你的代碼是 C ,插入extern "C" {告訴你的編譯器這個塊中的那些代碼是 C 代碼。
而且由于函式多載不是 C 語言的一部分,因此您的編譯器將在該塊內導致錯誤。(這對名稱修改很重要)。
但是這個宏主要用于頭檔案,而不是源檔案。因為這個宏的目的是讓你的代碼能夠被包含在 C 和 C 代碼中,但是源檔案不能也不能被另一個源包含。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/516298.html
標籤:Cc 11
