導航:首頁 > 源碼編譯 > c代碼調用c庫編譯問題

c代碼調用c庫編譯問題

發布時間:2023-05-18 00:10:49

1. 關於C++成語中調用C的庫函數問題

extern 「C「 是用來提示編譯器用c的庫文件來編譯這個cpp文褲遲氏件的,這是為了c++可支持旦碼c的類庫設計的。 你都測試過了,編譯加上extern 「C"和不加extern 「C」生成的函數名是不同的,加上是c的方式,不加胡散是c++的方式。

2. 如何在C++中調用C程序

如果引用多個,那麼就如下所示
extern 「C」{
#include 「 s.h」
#include 「t.h」
#include 「g.h」
#include 「j.h」};
然後在調用這些函數之前段前,需要將函數也全部聲明一遍。2.
C++調用搏枝C函數的方法,將用到的函數全部重新聲明一遍
extern 「C」{
extern void A_app(int);
extern void B_app(int);
extern void C_app(int);
C++語言支持函數重載,C語言不支持函數重載。函數被C++編譯後在庫中的名字與C語言的不同。假設某個C 函數的聲明如下:
void foo(int x, int y);
該函數被C 編譯器編譯後在庫中的名字為_foo,而C++編譯基燃敏器則會產生像_foo_int_int之類的名字用來支持函數重載和類型安全連接。由於編譯後的名字不同,C++程序不能直接調用C 函數。C++提供了一個C 連接交換指定符號extern「C」來解決這個問題。例如:
extern 「C」{
void foo(int x, int y);
// 其它函數}或者寫成
extern 「C」{
#include 「myheader.h」
// 其它C 頭文件}
這就告訴C++編譯譯器,函數 foo 是個C 連接,應該到庫中找名字_foo 而不是找_foo_int_int。

3. c文件中調用c++編寫的jlibrtp庫時,不能編譯通過,但是單獨編譯一個cpp文件能編譯通過,相同的編譯器。

無論如何,點是C + +支持函數重載,編譯obj或裡面的庫文件,將耦合的簽名和參數來區分不同功能的函數參數的同名函數名。然而,C語言不支持重載,所以有沒有這樣的函數名簽名。
在這種方式中,C語言程序調用C + +編寫的庫,你喚橋不會找到一個函數。

例陵鏈雹如,一個函數調用無效foo的(INT酒吧)之類的,可能是在C + +編譯器調用類的的名字foo_i,會被編譯成富裡面的c語言,如c語言程序找到富不會被發現,所以連接是錯誤的。函數名不會
要解決這尺帆個問題,引入EXTRN「C」{},C + +的加參數簽名的范圍,並保持統一的標准c語言,c語言兼容計劃。

4. 在c++中調用c的函數庫,請問這個怎麼處理編譯器報錯

<cctype>這種形式的C頭文件中的函數名稱放在std命名空間中.
using namespace std;導入std命名空間中所有名稱到當前全局,沒有錯誤。
是語法錯誤,有兩句可以改正為:
cout << "a" << (isalpha(a) ? "是英文字母" : "不是英文字母");

因為條件(三目運算)表達式相當於if-else.但要注意if-else屬於語句,而條件表達式屬於表達式,表達式的一個特徵是有一個值蔽飢模.它可以用在其它表達式肢兄能用的所有地方.條件表達式宏緩的語法:
cond-exp ? a : b
a和b必須是個表達式,兩者之一是條件表達式的值.a和b的類型要相同(如都是整數),如果類型不同,結果由類型轉換規則決定.如果轉換不了(例如a是字元串,而b是整數)就編譯錯誤.

5. 如果C++程序要調用已經被編譯後的C 函數,該怎麼辦

由於編譯後的名字不同,C++程序不能直接調用C 函數。C++提供了一個C 連接巧虧交換指定符號extern「C」來解決這個問題。例如:extern 「C」{void foo(int x, int y);?// 其它函數}或者寫成extern 「C」{#include 「myheader.h」?// 其它C 頭文件}這就告訴C++編譯孝野神譯器,函數foo 是個C 連接,應該到庫中找名脊洞字_foo 而不是找_foo_int_int。

6. c語言調用其他文件的函數怎麼編譯

調用函數庫的話用#include<XXX.h>或者#include"XXX.h"區別是你庫文件放在同一個文件夾還是在IDE的安裝目錄下面,如果你庫文件在你工程文件夾裡面用#include<XXX.h>,否則用#include"XXX.h"

如果你說自己寫庫的話是需要兩個宏命令,#ifndef_XXX_H#define_XXX_H,然後你函數名用extern表示

如果你說編譯的話,你應該說的是編譯原理吧,你可以反匯編一下一個編譯好的程序,如果該處編譯了一個其他函數庫的函數,你可以看到程序把參數PUSH到內存後CALL或者LCALL了一個這個函數的地址,這就完成了匯編中調用函數的部分,我記得X86裡面CALL的機器碼是E8H吧,有興趣的話可以自己用反匯編看一下

這個CALL的話就是調用函數的功能

7. 以及為什麼在C++中調用C語言編譯的函數時

1、一個函數(function)是一個可以從程序其它地方調用執行的語句塊。以下是函數定義格式:
type name ( argument1, argument2, ...) statement
說明:
type 是函數返回的數據的類型
name 是函桐岩數被調用時使用的名
argument 是函數調用需要傳入的參量局孫御(可以聲明任意多個參量)。每個參量(argument)由一個數據類型後面跟一個標識名稱組成,就像變數聲明中一樣(例如,int x)。參量僅在函數范圍內有效,凱拍可以和函數中的其它變數一樣使用, 它們使得函數在被調用時可以傳入參數,不同的參數用逗號(comma)隔開.
statement 是函數的內容。它可以是一句指令,也可以是一組指令組成的語句塊。如果是一組指令,則語句塊必須用花括弧{}括起來,這也是我們最常見到情況。其實為了使程序的格式更加統一清晰,建議在僅有一條指令的時候也使用花括弧,這是一個良好的編程習慣。
2、示例:每一個C語言程序有且只有一個main函數,本身main就是一個函數。

int main()
{
return 0;
}

8. 在C++ 程序中調用被 C 編譯器編譯後的函數,為什麼要加 extern 「C」聲明

總之,重點就是C++裡面支持函數的重載,因此編譯出來的.obj或者庫文件裡面,函數名會兆山枝被加上和參數有關的簽名,用來區分同樣函數名參數不同的函數。然而C語言唯穗不支持重載,所以函數名裡面沒有這樣的簽名。
這樣,當C語言的程序調用C++寫成的庫的時候,就會找不到函數。
比如,一個函數叫 void foo(int bar)之類的,可能會在c++編譯成叫 foo_i之類的名字,而在c語言裡面就會編譯成foo,這樣c語言的程序去找foo就會找族敏不到,這樣連接的時候會出錯。
為了解決這個問題,引入了extrn "c"{},在這個的作用域之內,c++的函數名不會加上參數簽名,和c語言的標準保持統一,就兼容c語言的程序了。

9. 如何解決C和C++互相調用的問題

在實際工作中可能經常要進行C和C++的混合賣侍編程,C++調用C語言的代碼通常都比較容易,但也有一些細節需要注意。C要調用C++的代碼就略為麻煩一些,因為C不支持面向對象的特徵。 1,首先我們來看一下C++調用C語言的代碼。要讓你的C代碼既能被C代碼又能被C++調用雖說容易,但是還是有需要注意的地方。現有三個文件分別如下:[cpp]#ifndef TESTC_H#defineTESTC_H#ifdef__cplusplus //2個下劃線extern"C"{#endifintadd(inta, intb);#ifdef__cplusplus}#endif#endif[cpp]#include "TestC.h"intadd(inta, intb){return(a+b);}[cpp]#include#include"TestC.h"intmain(){printf("add=%d\n" ,add(2,5));return0;}說明: file TestC.h是C的頭文件,file TestC.c是其實現文件,file TestCpp.cpp是調用C函數的C++文件。文件TestC.h中的TESTC_H定義是為了頭文件保護,」#ifdef__cplusplus 」這個不能缺少,你可以去查看C的標准庫頭文件中都有這個,如」stdio.h」。有了這個宏編譯器就知道現在是C還是C++在調用它。 C編譯器編譯後在符號庫中的名字為_add,而C++編譯器則會產生像_add_int_int之類的名字。C++正是依靠這種機制實現了函數的重載。 extern關鍵字表示將函數或變數聲明為全局類型,與之相對應的是static。static限定函數或變數的作用域為本文件。extern還有一個作用就中斗吵是與」C」連在一起使用,即extern「C」通知編譯器將extern 「C」所包含的代碼按照C的方式編譯和鏈接。 intb){return(a+b);}}; 將C++類封裝為C函數的文件(為了簡略也將聲明和實現放在了同一個文件中)如下:[cpp]#include"TestClass.h"extern"C"intadd_cpp(inta, intb);intadd_cpp(inta, intb){ADDs;return s.add(a,b) ;} 實際調用C++代碼的C文件如下:[cpp]#includeexternintadd_cpp(inta, intb);intmain(){printf("add_cpp=%d\n" ,add_cpp(2,5));return0;} 上面的過程很清晰,就是用一個函數將C++類的使用封裝起來,然後將它外部聲明為C函數就可以了。文件TestClass.h定義並實現了一個類,該類只有一個add方法。文件TestCpp.cpp定義並實現了一個函數add_cpp,函數中定義了一個HJH類對象並調用了該對象的add方法。然後將add_cpp函數進行外部聲明為C。 TestC.c文件中銷行為了使用add_cpp函數,也需要進行外部聲明。這是為了通知編譯器說明這個函數是在其他文件中實現(注意在C文件中的extern後面不可加」C」 )。

閱讀全文

與c代碼調用c庫編譯問題相關的資料

熱點內容
如何在文件夾中顯示頁碼 瀏覽:354
雲伺服器登不上qq 瀏覽:417
程序員四級工程師 瀏覽:715
薄荷app怎麼把體重清零 瀏覽:644
草料二維碼加密怎麼製作 瀏覽:851
04s519隔油池圖集pdf 瀏覽:242
程序員搞測試 瀏覽:552
蘋果app應用隱藏了怎麼辦 瀏覽:660
PDF調取 瀏覽:199
獨立柱加密需要什麼條件 瀏覽:814
php培訓出來找不到工作 瀏覽:106
小程序克隆源碼 瀏覽:448
python整數整除負數 瀏覽:880
遮天用什麼小說app看 瀏覽:645
什麼可以發類似朋友圈的app 瀏覽:495
cmd查找命令行 瀏覽:661
如何申請域名需要虛擬伺服器 瀏覽:497
氣體流量的演算法 瀏覽:634
大族加密狗滑鼠 瀏覽:23
php資料庫登錄界面 瀏覽:657