Неопределенная ссылка на `(анонимное пространство имен) :: - PullRequest
0 голосов
/ 12 февраля 2012

У меня есть пространство имен, которое я сейчас использую в двух классах. Когда я пытаюсь скомпилировать свой проект, я получаю эту ошибку, но мое пространство имен не является анонимным!

Один из моих классов выглядит так:

//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 ]

6 голосов
/ 12 февраля 2012

Вы #define d имя пространства имен прочь. После того, как препроцессор увидит #define specificMath, он найдет все экземпляры specificMath после этого и заменит их на то, к чему вы #define обращаетесь, что в данном случае - ничто. Так что это просто устраняет это.

#ifndef specificMath
#define specificMath
namespace specificMath {

После запуска препроцессора

namespace {

Всегда используйте все прописные буквы для макросов и никогда не ставьте перед ними подчеркивания.

#ifndef SPECIFIC_MATH_FUNCTIONS

например.

4 голосов
/ 12 февраля 2012

Он думает, что это анонимное пространство имен, потому что вы сделали его анонимным с помощью

#define specificMath

, поэтому «specificMath» будет расширяться до нуля.

Вы можете дать определению идентификатор, например

#define specificMath specificMath

или просто не используйте один и тот же идентификатор для защиты и пространства имен.

#ifndef SPECIFIC_MATH_H
#define SPECIFIC_MATH_H
namespace specificMath { ... }
#endif
0 голосов
/ 12 февраля 2012

Ваши макросы ifdef мешают вашим именам в mamespace.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...