【问题标题】:Using namespace in multiple VCL modules在多个 VCL 模块中使用命名空间
【发布时间】:2013-11-04 10:01:46
【问题描述】:

我想使用某个namespace 及其功能,以便以多种形式使用以具有某种共享功能。但是,我遇到了链接器问题。

这就是我所做的——我创建了一个新单元,并在其中写入了头文件:

#ifndef MyHeaderH
#define MyHeaderH

namespace MyHeader
    {
    enum { SOMETHING1, SOMETHING2 };
    void SomeFunction(int Param);
    }

#endif

当然,真正的函数是在cpp文件中定义的,以上只是来自h文件。

cpp文件如下:

#pragma hdrstop
#include "MyHeader.h"
#pragma package(smart_init)

void SomeFunction(int Param)
{
//some code here
}

所以在我的主要形式Form1 中,我将上述内容包含在Form1hpp文件中

MyHeader::SomeFunction(0);

这一切编译正常,但链接器报告未解析的外部。所以很明显它没有看到命名空间和功能。我该如何解决?

作为一个额外的问题 - 如果我以多种形式使用此类函数集,它应该只编译一次并正确重复使用(我猜它不会有多个相同函数的副本?)

【问题讨论】:

    标签: c++ linker namespaces c++builder


    【解决方案1】:

    您可能忘记将函数定义放在命名空间中。

    它要么像你在头文件中那样完成,但有一个函数体:

    namespace MyHeader
    {
        void SomeFunction(int Param)
        {
            // ...
        }
    }
    

    或者使用范围运算符:::

    void MyHeader::SomeFunction(int Param)
    {
        // ...
    }
    

    【讨论】:

    • 谢谢,我知道这是一些愚蠢的错误。在 cpp 文件中的函数实现之前包含MyHeader::,现在它可以编译了!另一个问题呢?这个函数现在在整个程序中只编译一次吗?
    • @Coder12345 是的,因为只有一个定义,所以函数只有一个副本。
    【解决方案2】:

    实际函数是在cpp文件中定义的,它没有实现头文件中声明的接口。

    实施

    namespace MyHeader
    {
        void SomeFunction(int Param) { /* Your implementation goes here. */ }
    }
    

    在 cpp 文件中。

    【讨论】:

      猜你喜欢
      • 2021-02-17
      • 1970-01-01
      • 2020-07-14
      • 2013-06-22
      • 2013-02-14
      • 2015-11-06
      • 2013-03-24
      • 1970-01-01
      • 2018-01-17
      相关资源
      最近更新 更多