gpt4 book ai didi

c++ - 为什么我可以在 main() 之前通过 std::map 填充变量?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:04:07 26 4
gpt4 key购买 nike

我在一个旧程序中偶然发现了一些奇怪的行为,并且弄清楚了为什么 G++ 和 CLang++ 允许它发生。我在 main() 之前声明并初始化了一些全局变量。奇怪的是,它们是通过静态 std::map 初始化的,同时使用下标运算符对其进行填充。一旦 main() 运行,一切似乎都在正确的位置, map 的大小显示正确数量的填充项目以及包含 main() 之前显示的值的变量。

#include <map>
#include <iostream>

static std::map<int, const char*> staticMap;

const char* const a = staticMap[0] = []()->const char* {return "a";}();
const char* const b = staticMap[1] = []()->const char* {return "b";}();
const char* const c = staticMap[2] = []()->const char* {return "c";}();
const char* const d = staticMap[3] = []()->const char* {return "d";}();
const char* const e = staticMap[4] = []()->const char* {return "e";}();

int main() {
std::cout << "# Items: " << staticMap.size() << '\n' << std::endl;

std::cout << "Values:\n";
std::cout << "\"a\" = " << a << '\n';
std::cout << "\"b\" = " << b << '\n';
std::cout << "\"c\" = " << c << '\n';
std::cout << "\"d\" = " << d << '\n';
std::cout << "\"e\" = " << e << '\n';

std::cout << std::endl;

std::cout << "Map Contents:" << std::endl;;
for (unsigned i = 0; i < 5; ++i) {
std::cout << "\t" << staticMap[i] << std::endl;
}

return 0;
}

这是尝试 G++ 和 CLang 后的结果(我使用了标志 -std=c++11 -Wall -Werror -Wextra -pedantic-errors):

# Items: 5
Values:
"a" = a
"b" = b
"c" = c
"d" = d
"e" = e
Map Contents:
a
b
c
d
e

这是 C++ 固有的允许吗?我什至创建了自己的 map 类型并得到了相同的结果,但我仍然不确定它是否是我可以依赖的行为。

最佳答案

这是完全正确的代码,尽管有点不寻常。该标准保证同一 TU 中的全局变量按声明顺序初始化(因此 staticMap 将在其他初始化发生之前构建),并且在初始化表达式中包含对重载运算符的调用并不奇怪。

实际上,所有 lambda 的东西都太过分了,你可以 simply do :

const char* a = staticMap[0] = "a";
const char* b = staticMap[1] = "b";
const char* c = staticMap[2] = "c";
const char* d = staticMap[3] = "d";
const char* e = staticMap[4] = "e";

或者,even simpler :

const char *dummy = (
staticMap[0]="a",
staticMap[1]="b",
staticMap[2]="c",
staticMap[3]="d",
staticMap[4]="e");

一般来说,如果你为 main 定义了一个类,你可以在 main 之前执行你想要的所有代码:

class MyCode
{
MyCode()
{
// here be your code
}
};
static MyCode m;

但是要小心,调试在 main 开始之前运行的代码通常是一个毛茸茸的困惑,最好避免。在我最近的所有项目中,几乎没有代码在全局变量的构造函数中运行,更多时候我只是将相关的“全局变量”创建为 main 的局部变量,并将指向它们的指针存储在全局变量中。

关于c++ - 为什么我可以在 main() 之前通过 std::map 填充变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27663947/

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