Edd*_*223 6 c++ linker-errors precompiled-headers
这些函数是我的大多数程序对象将使用的实用程序类型的东西.我希望将它们放在命名空间中并使它们具有全局性.此命名空间在标头中定义,然后添加到我的预编译标头中.但是到目前为止,我已经在2个不同的对象中使用了这个命名空间中的函数,并且编译器在这两个对象上抛出了多次定义的符号错误.
命名空间文件
#ifndef UTILS_H
#define UTILS_H
#include <random>
#include <cmath>
namespace Utils
{
extern int GetRandomBetween(int low, int high)
{
if (low < 0 || low >= high)
return 0;
int seed = high - low;
return (rand() % seed) + low;
}
};
#endif
Run Code Online (Sandbox Code Playgroud)
和我的precomp标题
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#pragma once
#include "targetver.h"
//#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
// Windows Header Files:
#include <windows.h>
// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include <random>
#define SAFE_DELETE( p ) { if( p ) { delete ( p ); ( p ) = NULL; } }
#define SAFE_DELETE_ARRAY( p ) { if( p ) { delete[] ( p ); ( p ) = NULL; } }
#define SAFE_RELEASE( p ) { if( p ) { ( p )->Release(); ( p ) = NULL; } }
// TODO: reference additional headers your program requires here
#include "Utils.h"
#include "Manager.h" // this object uses utils
#include "Bot.h" // this object uses utils
#include "LinkedList.h"
#include "Village.h" // this object will use utils in the future
Run Code Online (Sandbox Code Playgroud)
链接器错误消息:
Manager.obj : error LNK2005: "int __cdecl Utils::GetRandomBetween(int,int)" (?GetRandomBetween@Utils@@YAHHH@Z) already defined in Bot.objstdafx.obj : error LNK2005: "int __cdecl Utils::GetRandomBetween(int,int)" (?GetRandomBetween@Utils@@YAHHH@Z) already defined in Bot.objc:\users\lee\documents\visual studio 2010\Projects\AI\Debug\AI.exe : fatal error LNK1169: one or more multiply defined symbols found
它也许值得注意的是,在我的Manager类头中,我转发声明了Bot.与Village类标题相同.
Nic*_*las 11
您的函数定义(即:源代码)不应位于标题中.您获得多个定义的原因是extern无法将函数定义(源代码)转换为函数声明(即:只是原型).所以你需要这样做:
Util.h:
namespace Utils
{
int GetRandomBetween(int low, int high);
};
Run Code Online (Sandbox Code Playgroud)
SomeSourceFile.cpp(可能是Util.cpp):
namespace Utils
{
int GetRandomBetween(int low, int high);
{
if (low < 0 || low >= high)
return 0;
int seed = high - low;
return (rand() % seed) + low;
}
};
Run Code Online (Sandbox Code Playgroud)
或者,您可以inline在标头中声明该函数:
namespace Utils
{
inline int GetRandomBetween(int low, int high)
{
if (low < 0 || low >= high)
return 0;
int seed = high - low;
return (rand() % seed) + low;
}
};
Run Code Online (Sandbox Code Playgroud)
虽然你应该只将它用于小功能.
| 归档时间: |
|
| 查看次数: |
7682 次 |
| 最近记录: |