在多个VCL模块中使用命名空间

时间:2013-10-25 10:23:05

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

我想使用某个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中,我将上述内容包含在Form1

hpp 文件中
MyHeader::SomeFunction(0);

这一切都很好,但链接器报告未解析的外部。显然它没有看到名称空间和功能。我该如何解决这个问题?

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

2 个答案:

答案 0 :(得分:2)

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

实施

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

在cpp文件中。

答案 1 :(得分:2)

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

它或者像在头文件中那样完成,但是使用函数体:

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

或使用范围运算符::

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