2015-05-28 6 views
1

Существует много вопросов об этой ошибке. Но они связаны только с одной переменной.Ошибка lnk2005, уже определенная в .obj

test.h

namespace World 
{ 
    enum Objects 
    { 
     TERRAIN = 1, 
     BOX = 2, 
     SPHERE = 4, 
     CAPSULE = 8 

    }; 

    void WorldObjects2(unsigned int mask) 
    { 
     ....... 
    } 
} 

void test(); 

test.cpp

#include "test.h" 

void test() 
{ 
    ....... 
} 

main.cpp

#include "test.h" 
int main() 
{ 
    test(); 
    return 0; 
} 

Когда я запускаю этот код на Visu al stduio 2013, он выдает ошибку. В нем говорится, что error LNK2005: "void __cdecl World::WorldObjects2(unsigned int)" ([email protected]@@[email protected]) already defined in main.obj. Как я могу исправить эту ошибку?

+0

Возможный дубликат [ошибка LNK2005: уже определена - C++] (http://stackoverflow.com/questions/622229/error-lnk2005-already-defined-c) – Timo

ответ

1

Ваш проект имеет два определения функции WorldObjects2: один в блоке test.cpp компиляции и другой в блоке main.cpp компиляции, так как заголовок, где определяется функция включена в этих двух CPP файлов.

Либо используйте функцию спецификатор inline

inline void WorldObjects2(unsigned int mask) 
{ 
    ....... 
} 

Или переместить определение функции в некоторой CPP файл, оставив только объявление функции (без его определения) в заголовке.

Другой подход заключается в том, чтобы функция имела внутреннюю связь. Например, вы можете добавить ключевое слово static

static void WorldObjects2(unsigned int mask) 
{ 
    ....... 
} 

или можете разместить функцию в пространстве имен без имени в пределах данного пространства имен.

namespace World 
{ 
    // ... 
    namespace 
    { 
     void WorldObjects2(unsigned int mask) 
     { 
      ....... 
     } 
    } 
} 
+0

Вы знаете, почему защитник включения не работает Это дело? – Timo

+1

@Timo Это работает. Просто есть два отдельных блока компиляции, каждый из которых включает заголовок. –

+0

Считая, что 'static' также является опцией. Нашли объяснение здесь: http://forums.codeguru.com/showthread.php?285375-inline-function-vs-static-function – Timo

0

Я предложил бы использовать включить охрану в файле test.h:

#ifndef TEST_H 
#define TEST_H 
namespace World 
{ 
    enum Objects 
    { 
     TERRAIN = 1, 
     BOX = 2, 
     SPHERE = 4, 
     CAPSULE = 8 

    }; 

    void WorldObjects2(unsigned int mask) 
    { 
     ....... 
    } 
} 

void test(); 
#endif /* TEST_H */ 

Некоторые люди предпочитают использовать вместо #pragma once КРП и определить комбинацию, но это не должно иметь значения, в результате.

Эти два параметра не позволяют компилятору дважды добавлять один и тот же заголовочный файл. Если вы дважды добавляете один и тот же заголовочный файл, вы можете не только создавать ошибки, как вы сталкиваетесь, но и увеличивать время компиляции.

+0

Спасибо. Я попробовал, но это не решение. – zumma