如果我在方法或 winmain 之外使用此代码:
ostringstream vertexid;
vertexid << "bob";
vertexid << " ";
vertexid << " ";
vertexid << 48348093490;
我得到各种各样的语法错误。范围如何发挥作用,为什么会发生这种情况?
你可以这样做:
std::ostringstream ss;
#define nil(x) ((x), 0)
int x = nil(ss << "Hello");
int y = nil(ss << ", World!");
int z = nil(ss << std::endl);
如果你真的不喜欢想出变量名,那么你可以做一些更疯狂的事情:
#define nilPASTE(x, y) x ## y
#define nilPASTE2(x, y) nilPASTE(x, y)
#define nil2(x) static int nilPASTE2(line_, __LINE__) = nil(x)
nil2(ss << "Goodbye");
nil2(ss << ", Sun!");
nil2(ss << std::endl);
您问:
范围如何发挥作用,为什么会发生这种情况?
我假设您提到范围,因为这是一些错误消息吐出的内容。但是这个问题的两个部分的答案是 C++ 编译器遵循 C++ 语言的规则,它不允许语句出现在任何地方。它们只能出现在允许的地方,即在函数和方法体中。我的技术被允许的原因是因为我使用了表达式,表达式可以出现在更多的地方。特别是,它们被允许出现在变量的初始化程序中。当然,在翻译单元的最外层允许变量声明。
所有这些令人毛骨悚然的东西都意味着:将您的语句放在函数和方法中。
您只能在全局范围内声明或定义内容。
单独的第一行就可以了(在实现文件中......如果在标题中,您可能会有多个定义并且需要将其声明为extern
而不是定义它),下一行是不合法的。
在全局命名空间中,你不能有代码,因为它应该什么时候执行?您只能将可执行语句放入函数中,例如WinMain
/ main
。
执行从WinMain
/开始main
,然后您可以从那里调用其他函数。