未明确引用`(匿名命名空间)::

时间:2012-02-12 19:39:25

标签: c++ compilation namespaces

我有一个我目前在两个类中使用的命名空间。当我尝试编译我的项目时,我得到了该错误,但我的命名空间不是匿名的!

我的一个课程看起来像这样:

//margin.cpp
#include <math.h>
#include "margin.h"
#include "anotherClass.h"
#include "specificMath.nsp.h" //My namespace

double margin::doSomeMath(double a, double b){
    return specificMath::math_function1(0, 1, 0);
    // Just a simpler, random example
} 

我的命名空间如下所示:

//specificMath.nsp.h
#ifndef specificMath
#define specificMath
namespace specificMath {
     double math_function1(double, double, double);
     double math_function1(double);
     //more functions
}

 //specificMath.nsp.cpp
 #include <stdlib.h>
 #include "constants.h"
 #include "specificMath.nsp.h"

 namespace specificMath{
     double math_function1(double a, double b, double c){
          //some code
     }
     ... more functions
 }

当我尝试编译时,似乎编译正常,但是在链接时(我一直在做“make clean”以确保它使用新文件)我得到一个错误说:

margin.o: In function `margin::doSomeMath(double, double)':
margin.cpp:(.text+0x3d): undefined reference to `(anonymous namespace)::math_function1(double, double, double)'

为什么它认为它是一个匿名命名空间?我怎样才能解决这个问题?

我编译这样做:

g++ -I. -c -w *.h *.cpp

然后......

g++ -o myProgram *.o 

3 个答案:

答案 0 :(得分:6)

#define了名称空间名称。在预处理器看到#define specificMath之后,它会在此之后找到specificMath的所有实例,并将它们替换为您#define的内容,在这种情况下,它不是什么。所以它简单地消除了它。

#ifndef specificMath
#define specificMath
namespace specificMath {

预处理器运行后

namespace {

始终将所有大写都用于宏,并且永远不会在它们前面添加下划线。

#ifndef SPECIFIC_MATH_FUNCTIONS

例如。

答案 1 :(得分:4)

它认为它是一个匿名命名空间,因为你用

匿名
#define specificMath

所以“specificMath”将扩展为空。

您可以为定义指定标识符,例如

#define specificMath specificMath

或者只是不要对include guard和namespace使用相同的标识符。

#ifndef SPECIFIC_MATH_H
#define SPECIFIC_MATH_H
namespace specificMath { ... }
#endif

答案 2 :(得分:0)

您的ifdef宏正在干扰您的mamespace名称。