【问题标题】:Where should I put my DECLSPEC for a namespace?我应该将我的 DECLSPEC 放在哪里作为命名空间?
【发布时间】:2011-05-11 03:41:51
【问题描述】:

给定以下命名空间,我应该将我的 declspec(用于 dll 导出)放在哪里,我希望将所述命名空间中的所有方法都导出到 DLL 中?

namespace AguiText {
    void drawTextArea(AguiGraphicsManager *g, const AguiFont &font,const AguiRectangle &area,
        const AguiColor &color, const std::vector<std::string> &lines,
        AguiHorizontalAlignmentEnum horizontalAlignment, AguiVerticalAlignmentEnum verticalAlignment);

    void divideText(std::vector<std::string> &words, 
        const std::string &text,const AguiFont &font, int maxWidth = -1);
    void makeTextLines(const AguiFont &font,const std::vector<std::string> &words,
        std::vector<std::string> &lineWords, int maxWidth );
    void pointInTextArea(const AguiFont &font, 
        const AguiRectangle &area, const AguiPoint &point, 
        const std::vector<std::string> &lines, AguiRectangle &retRect,
        int &retIndex, AguiHorizontalAlignmentEnum horizontalAlignment, AguiVerticalAlignmentEnum verticalAlignment);

}

谢谢

【问题讨论】:

  • 函数模板必须在头文件中声明(除非你打算只为一组特定的参数实例化它)。因此无需导出。
  • @Oil AguiText 命名空间呢?

标签: c++


【解决方案1】:

无需导出命名空间。从编译代码的角度来看,命名空间是没有意义的。您不能在代码中引用它们,它们只是定义范围。

在名称修改过程中,命名空间最终成为类/函数名称的一部分。一旦源文件被编译,它们就不是单独的实体。

如果要导出命名空间的内容,则需要导出这些实体,而不是命名空间本身。

【讨论】:

  • 那我在哪里添加 AGUI_DECLSPEC 以便导出里面的函数,比如 drawTextArea?
  • 我做 AGUI_DECLSPEC void someThing();
  • 函数和类是要导出的实际实体,因此您可以将__declspec 放在它们周围。将命名空间视为您贴在函数上的小贴纸。贴纸本身并没有定义实体,它们只是装饰其他东西。它们没有定义可用的对象。它们只是标记。
  • 我不知道我是否会说“不需要导出命名空间”。无法导出命名空间。 __declspec(dllexport/dllimport) 只能应用于类型、函数或变量声明。
  • 将 __declspec(dllexport) 添加到 .h 中的声明解决问题
猜你喜欢
  • 1970-01-01
  • 2020-09-30
  • 2019-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
相关资源
最近更新 更多