c ++:g ++:extern" C"功能定义?

时间:2015-08-28 19:39:07

标签: c++ namespaces g++ extern

我无法使用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);
}

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

帮助?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

首先,不要在命名空间中定义外部函数,这没有任何意义。要检查目标文件中生成函数的名称,请使用名为nm(on * nix)的实用程序。它应该告诉你这个名字是否被破坏了。

在您的情况下,我认为问题是您有一个具有不同名称和C ++链接的重载。我建议你以不同的方式命名你的C-linkage函数。