我正在使用一個在C++程序中同時具有C接口和C++接口的庫。 C++有點不成熟,我必須堅持使用C語言。我更加籠統地想知道,將C風格的二進制對象文件與C++項目混合時,有什麼特別需要記住的嗎?從C++程序中的C庫調用函數時是否有任何缺陷?
1
A
回答
5
對於要從C++調用的C函數,它們必須聲明爲extern "C"
。通常像這樣在頭部使用:
#if defined(__cplusplus)
extern "C" {
#endif
void f();
void g();
#if defined(__cplusplus)
}
#endif
0
從C++程序中調用C函數很常見。只有一件事要記住 - 使用C++鏈接器:)請記住,C函數不能使用異常,因此您必須檢查它們的返回值。
編輯:別人指出C函數聲明應該包裝在extern "C" {...}
。通常這已經在庫頭文件中完成了。
2
C函數必須聲明爲extern「C」,如果你的C頭文件不會自動做到這一點,你可以像下面這樣做對整個頭:
extern "C"
{
#include "c-library.h"
}
否則,只要因爲你使用C++鏈接器的一切都會好的:)。
1
一件事是RAII。說,如果你的C庫有一個初始化和釋放功能,即可以很容易地包裹成資源管理類:
#include <boost/utility.hpp>
/// Base class for top-level library objects
class lib_base: boost::noncopyable
{
protected:
lib_base()
{
if (my_c_lib_init() == -1)
throw std::runtime_error("no C lib");
}
~lib_base() { my_c_lib_fini(); }
};
/// Widget from C library
class widget: lib_base
{
public:
widget(const std::string& name) :
lib_base(), pcw_()
{
if ((pcw_ = my_c_lib_alloc_widget(name.c_str())) == NULL)
throw std::runtime_error("no more widgets");
}
~widget() { my_c_lib_release_widget(pcw_); }
private:
c_widget* pcw_; //< low-level widget
};
這當然使得子類不可複製,但可以圍繞通過遏制地工作, /或智能指針。
相關問題
- 1. 從C程序中調用C++函數
- 2. var something = something ||是否有任何缺陷? {}
- 3. 在使用IronRuby編寫WPF應用程序時是否有任何缺陷?
- 4. IdnMapping :: GetAscii C#Methode是否有任何等效的C/C函數?
- 5. C中是否有任何庫函數來檢查Internet連接?
- 6. 函數C++ OpenCv錯誤凸起缺陷
- 7. c#中是否有任何一種「時間處理程序」?
- 8. 從C++庫調用C++/CLI函數
- 9. Python庫:如何從Python程序調用C++函數?
- 10. 從Cobol程序調用C函數
- 11. 從C#應用程序調用Delphi函數時調用PInvokeStackImbalance
- 12. 是否有可能從Silverlight/C#中調用matlab函數?
- 13. 調用C中的Python函數++程序
- 14. Excel中調用C的函數++程序
- 15. 調用C++程序中的dll函數
- 16. 是否有任何C++ XSLT庫?
- 17. 用指針初始化引用:是否有任何缺陷?有沒有其他的選擇? (C++)
- 18. C++中是否有任何線程安全的圖形庫?
- 19. 是否可以通過函數地址從lua腳本中調用任何主機c/C++函數?
- 20. C++中是否有「線性二次調節器」函數庫
- 21. 在MFC中調用OnInitDialog函數後是否有任何函數?
- 22. 是否有任何庫爲C/C++守護程序提供管理CLI?
- 23. 從C#調用c函數#
- 24. 調用C++函數,從C#
- 25. 從C++調用C#函數?
- 26. 如何從PHP的C程序中調用函數?
- 27. C程序如何調用Perl函數?
- 28. Hangman程序中的缺陷
- 29. C或C++中是否有任何原始TCP庫?
- 30. 從C調用數據庫函數#
運行時鏈接程序不是C或C++特有的。無論如何,C函數都需要聲明爲「extern」C「'。 – 2010-04-13 13:10:26
確實,我的不好,我會編輯答案。 – KillianDS 2010-04-13 13:11:43