如何在DLL中创建具有变量参数的非成员函数?

How can I create a non-member function with variable arguments in a DLL?

提问人:Joe S 提问时间:10/20/2014 最后编辑:Joe S 更新时间:10/20/2014 访问量:198

问:

我正在我的 DLL 中编写我自己的 String 类,我希望能够像 printf/etc 那样格式化文本,但无论我如何尝试实现这一点,当我尝试链接我的 DLL 时,我都会在我的函数上得到带有省略号的“未解析的外部符号”,尽管它们已经定义。我尝试在我的 String 类中将字符串格式化程序实现为构造函数,如下所示:

class DLLEXP String
{
public:
    String();
    String(const String &other);
    String(const String &format, ...);
    // more member funcs
}

我还尝试在单独的类 StringFormat 中将其实现为构造函数:

class DLLEXP StringFormat
{
public:
    StringFormat();
    StringFormat(const StringFormat &other);
    StringFormat(const String &format, ...);
};

class DLLEXP String
{
public:
    String();
    String(const String &other);
    String(const StringFormat &format);
    // more member funcs
};

我也尝试过常规功能:

DLLEXP String StringFormat(const String &format, ...);

甚至:

DLLEXP char* __cdecl StringFormat(const char *format, ...);

从DLL正确导入变量参数函数是否有某种秘密,或者这在Windows上根本不可能?一旦我删除省略号,上述每个函数都可以完美运行......但我需要那些。此外,这些函数在 Linux 上的共享库中也能正常工作。我已经为此扯了几个小时的头发,所以非常感谢任何帮助。

提前致谢

C++ DLL printf 未解析的外部 可变函数

评论

0赞 Ulrich Eckhardt 10/20/2014
我不能直接回答你的问题,但可以给你一个解决方法。将其实现为内联函数,并公开一个取 a 的函数,类似于 / 对。您还可以查看这两个以了解它们是如何实现的。也就是说,为什么不使用模板而不是类型不安全的格式字符串呢?va_listsprintfvsprintf
1赞 Praxeolitic 10/20/2014
错误到底是什么?什么是未定义?
0赞 Joe S 10/20/2014
@UlrichEckhardt 我可以编写什么样的模板来提供与变量参数相同的灵活性?
0赞 Joe S 10/20/2014
@Praxeolitic 任何带有“...”的函数尽管它已定义,但它是一个未解决的外部。
0赞 Ulrich Eckhardt 10/21/2014
例如,查看 Boost.Format。在 C++ 11 中,我相信甚至还有可变参数模板。但是,它仍然不是相同的灵活性,这是您为类型安全付出的代价。

答: 暂无答案