2010-04-13 40 views

回答

5

對於要從C++調用的C函數,它們必須聲明爲extern "C"。通常像這樣在頭部使用:

與C++的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++鏈接器的一切都會好的:)。

+0

運行時鏈接程序不是C或C++特有的。無論如何,C函數都需要聲明爲「extern」C「'。 – 2010-04-13 13:10:26

+0

確實,我的不好,我會編輯答案。 – KillianDS 2010-04-13 13:11:43

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 
}; 

這當然使得子類不可複製,但可以圍繞通過遏制地工作, /或智能指針。

相關問題