gpt4 book ai didi

C++组织实用程序代码,避免 "multiple definition of .."

转载 作者:行者123 更新时间:2023-11-30 01:56:07 26 4
gpt4 key购买 nike

想做一些全局 map ,应该用的地方比较多,常用的小功能很少。这是我尝试组织它的方式。

util.h:

#ifndef UTIL_H
#define UTIL_H

#include <unordered_map>

namespace util {

extern std::unordered_map<std::string, short> rgb2short {
{ "000000", 0 },
{ "800000", 1 },
{ "008000", 2 },
{ "808000", 3 },
{ "000080", 4 },
/* ... and so on */
};

short some_util_func() {
/* some util code here */
}

}
#endif

somefile.cpp:

#include "util.h"

/* usage of util::rgb2short and util::some_util_func() */

someotherfile.cpp:

#include "util.h"

/* usage of util::rgb2short and util::some_util_func() */

编译器不接受并响应大量'util::rgb2short'等的多重定义

所以,问题是应该如何更好地组织这个实用程序。

最佳答案

至少在涉及数据时, header 应该只包含一个声明。该声明必须包含 extern 关键字,并且(您做错的部分)必须包含初始化程序。

唯一的异常(exception)(而且它根本不常见)是如果您想要为每个包含标题的翻译单元的数据单独拷贝。在这种非常特殊的情况下,您需要指定数据是 static 而不是 extern

在您的情况下,util.h 应仅包含 rgb2short 的外部声明。定义(包括初始化程序)应该在某个 .cpp 文件中(例如,util.cpp)。同样,util.h 不应包含 some_util_func() 的定义。它应该只包含一个声明,以及(再次)放在源文件中的定义,例如 util.cpp

因此,util.h 最终看起来像这样:

#ifndef UTIL_H
#define UTIL_H

#include <unordered_map>

namespace util {

extern std::unordered_map<std::string, short> rgb2short;

short some_util_func();

}
#endif

Util.cpp 看起来像这样:

#include "util.h"

namespace util {

std::unordered_map<std::string, short> rgb2short {
{ "000000", 0 },
{ "800000", 1 },
{ "008000", 2 },
{ "808000", 3 },
{ "000080", 4 },
/* ... and so on */
};

short some_util_func() {
/* some util code here */
}

}

然后你将 #include "util.h" 就像你所做的那样,但也链接 util.obj(或 util.o,或任何对象文件被命名)与其他目标文件。

关于C++组织实用程序代码,避免 "multiple definition of ..",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20152548/

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