为什么我不能添加到方法/函数之外的ostringstream

时间:2012-06-19 07:57:27

标签: c++ stl

如果我在方法或winmain之外使用此代码:

ostringstream vertexid;
vertexid << "bob";

vertexid << " ";
vertexid << " ";

vertexid << 48348093490;

我遇到各种语法错误。范围如何发挥作用为什么会发生这种情况?

3 个答案:

答案 0 :(得分:2)

您可以这样做:

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 ++语言的规则,它不允许语句出现在任何地方。它们只能出现在允许的位置,它们位于函数和方法体中。我的技术被允许的原因是因为我使用表达式,并且表达式可以出现在更多地方。特别是,它们可以出现在变量的初始值设定项中。当然,在翻译单元的最外层允许变量声明。

所有这些gobbly gook意味着:将你的陈述放在函数和方法中。

答案 1 :(得分:1)

您只能在全球范围内声明或定义内容。

单独的第一行就可以了(在实现文件中...如果在标题中,您可能会有多个定义,并且需要将其声明为extern而不是定义它),接下来的行是只是不合法。

答案 2 :(得分:-2)

在全局命名空间中,您不能拥有代码,因为何时应该执行它?您只能将可执行语句放在函数中,例如WinMain / main

执行从WinMain / main开始,然后您可以从那里调用其他功能。