gpt4 book ai didi

c++ - 在 C++ 无类变量中避免 "already defined in ..."错误/警告

转载 作者:太空狗 更新时间:2023-10-29 19:53:44 26 4
gpt4 key购买 nike

我在 Utility 命名空间中定义了全局变量。该实用程序包含在多个文件中,如下所示:

#ifndef _UT_
#define _UT_
namespace UT {
std::string PLATFORM_LINUX_NAME = "linux";
std::string PLATFORM_MACOSX_NAME = "macosx";
std::string PLATFORM_WINDOWS_NAME = "windows";
#if defined(OS_WIN)
int PLATFORM = OSTYPE::PLATFORM_WINDOWS;
#elif defined(OS_LINUX)
int PLATFORM = PLATFORM_LINUX;
#elif defined(OS_APPLE)
int PLATFORM = PLATFORM_MACOSX;
#endif
};

当我将此文件包含在例如文件 A.h、B.h 和 C.h 中时,我收到一条编译器警告:

warning LNK4006: "int UT::PLATFORM" (?PLATFORM@UT@@3HA) already defined in A.obj; second definition ignored
warning LNK4006: "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > UT::PLATFORM_LINUX_NAME" (?PLATFORM_LINUX_NAME@UT@@3V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@A) already defined in A.obj; second definition ignored

不涉及创建类来解决此问题的最佳方法是什么?还是创建 UT 类是唯一的方法?

最佳答案

在单个.cpp 文件中定义变量,并在.h 文件中声明它们。在 UT.h 中:

namespace UT
{
extern const std::string PLATFORM_LINUX_NAME;
extern const std::string PLATFORM_MACOS_NAME;
extern const std::string PLATFORM_WINDOWS_NAME;
extern const int PLATFORM;
}

UT.cpp 中:

namespace UT
{
const std::string PLATFORM_LINUX_NAME = "linux";
const std::string PLATFORM_MACOS_NAME = "macosx";
const std::string PLATFORM_WINDOWS_NAME = "windows";

#if defined(OS_WIN)
const int PLATFORM = OSTYPE::PLATFORM_WINDOWS;
#elif defined(OS_LINUX)
const int PLATFORM = PLATFORM_LINUX;
#elif defined(OS_APPLE)
const int PLATFORM = PLATFORM_MACOSX;
#endif


}

我添加了 const 限定符,因为它们看起来是常量值。

关于c++ - 在 C++ 无类变量中避免 "already defined in ..."错误/警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11293874/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com