假设我有一个c++头文件
utils.h
我想在多个tu中有一些常数映射(map不在类中,正常的全局变量/常数)。
const std::map<int, std::string> ToString{{1,"1"}, {2, "2"}};
我应该声明内联还是静态?换句话说:
static const std::map<int, std::string> ToString{{1,"1"}, {2, "2"}};
或
inline const std::map<int, std::string> ToString{{1,"1"}, {2, "2"}};
(我知道两者都可以防止ODR冲突,静态通过使链接内部,内联通过允许有多个定义,但我可能是错的,我经常在写ODR时犯错误)。
注意:我想避免使用extern
的解决方案。
问得好!我想你可以用这两种方法来达到你的目标:
// utils.h
#include <map>
static inline const std::map<int, std::string> ToString{{1,"1"}, {2, "2"}};
inline
提示编译器将包含该头文件的所有文件合并为一个文件,从而满足ODR。注意:在c++ 20中,inline
只是为了可读性,因为编译器会忽略它,如果它不打算提高性能。static
强制ToString
为编译时值,这有助于提高性能。
还有一个选项
// header file main.h
#pragma once
#include <map>
#include <string>
static const auto& get_string_map()
{
static const std::map<int, std::string> ToString{ {1,"1"}, {2, "2"} };
return ToString;
}
// implementation file main.cpp
#include <iostream>
#include "main.h"
int main()
{
auto map = get_string_map();
std::cout << map.at(1);
}