我无法使用extern "C"
函数接口创建一个C ++库。我有以下标题
#ifndef MYUTILITIES_H_
#define MYUTILITIES_H_
namespace MYUtilities {
static std::string UpperCase(std::string);
class MyException: public std::exception {
public:
MyException(std::string ss)
: s(ss) {
}
~MyException() throw () {
} // Updated
std::string s;
const char* what() const throw () {
return s.c_str();
}
};
} /* namespace ITGUtilities */
/*
* General utility functions
*/
extern "C" const char * UpperCase(const char *);
#endif /* MYUTILITIES_H_ */
源文件
#include "ITGUtilities.h"
namespace ITGUtilities {
const char * UpperCase(const char * str) {
std::string tmp = str;
std::transform(tmp.begin(), tmp.end(), tmp.begin(), ::toupper);
return tmp.c_str();
}
std::string UpperCase(std::string str) {
std::string tmp = str;
std::transform(tmp.begin(), tmp.end(), tmp.begin(), ::toupper);
return tmp;
}
} // namespace ITGUtilities
在.cpp源文件中,我尝试在命名空间的内部和外部定义char *UpperCase(const char *)
例程。在任何一种情况下,尝试使用此库的任何内容都无法找到extern
函数的引用。
我在MySQL C ++ cppcon/driver.h
标题中看到了一个示例,其中extern
定义位于标题中但位于名称空间之外。
extern "C"
{
CPPCONN_PUBLIC_FUNC sql::Driver * get_driver_instance();
/* If dynamic loading is disabled in a driver then this function works just like get_driver_instance() */
CPPCONN_PUBLIC_FUNC sql::Driver * get_driver_instance_by_name(const char * const clientlib);
}
我只是不知道我应该在这里使用什么魔法。
帮助?
答案 0 :(得分:1)
使用花括号来定义外部C函数:
extern "C"
{
UpperCase(const char *);
}
答案 1 :(得分:0)
首先,不要在命名空间中定义外部函数,这没有任何意义。要检查目标文件中生成函数的名称,请使用名为nm(on * nix)的实用程序。它应该告诉你这个名字是否被破坏了。
在您的情况下,我认为问题是您有一个具有不同名称和C ++链接的重载。我建议你以不同的方式命名你的C-linkage函数。