inline vs static用于非成员全局变量



假设我有一个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);
}

相关内容

  • 没有找到相关文章