【问题标题】:Why can't I add to a ostringstream outside a method/function为什么我不能在方法/函数之外添加到 ostringstream
【发布时间】:2012-06-21 05:48:46
【问题描述】:

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

ostringstream vertexid;
vertexid << "bob";

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

vertexid << 48348093490;

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

【问题讨论】:

    标签: c++ stl


    【解决方案1】:

    你可以这样做:

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

    所有这些愚蠢的意思是:将您的语句放入函数和方法中。

    【讨论】:

    • 使用逗号操作符,不需要定义nil:int x = (ss &lt;&lt; "Hello", 0);
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      执行从WinMain/main开始,然后你可以从那里调用你的其他函数。

      【讨论】:

      • 您可以在 main - stackoverflow.com/a/10897576/673730 之前调用函数 - 并且您可以在全局命名空间中拥有代码 - 请参阅 user315052 的答案。
      • 我知道,但是这些过于复杂的问题对提出问题的人没有帮助,这只是极客的谈话。
      • 如果您查看我的回答,您会发现我在不提供 false 信息的情况下避免了这些“过度复杂化” - 是的,您的陈述是错误的。
      • 我知道。但这是善意的谎言。我看了你的答案,决定提供我的答案,因为你把这些重新定义的东西扔给他,而他显然不知道更基本的东西,这对我来说似乎没有多大帮助。
      猜你喜欢
      • 1970-01-01
      • 2022-01-24
      • 2012-08-17
      • 2015-03-05
      • 2019-02-12
      • 1970-01-01
      相关资源
      最近更新 更多