C++: G++: 外部"C"函数定义?

c++: g++: extern "C" function definition?

本文关键字:定义 函数 外部 C++ G++      更新时间:2023-10-16

我在创建一个带有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);
}

我只是不知道我应该在这里使用什么魔法。

帮助吗?

使用花括号来定义您的外部C函数:

extern "C"
{
    UpperCase(const char *);
}

首先,不要在名称空间中定义外部函数,这没有意义。要检查对象文件中生成的函数的名称,请使用名为nm的实用程序(在*nix上)。它应该告诉你名字是否被打乱了。

在您的例子中,我假设问题是您有一个具有不同名称和c++链接的重载。我建议您将C-linkage函数命名为不同的名称