Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在main()之外调用方法是否错误_C++ - Fatal编程技术网

C++ 在main()之外调用方法是否错误

C++ 在main()之外调用方法是否错误,c++,C++,我想知道是否有人可以解释以下错误的含义: 代码 #include "sstream" std::stringstream h; h.str(""); //clearing the stringstream object int main() 错误 kial.cpp:5:1:错误:“h”未命名类型h.str(“”) 另外,为什么尝试访问main()之外的方法是错误的?编译器假定您尝试进行声明(或定义),因为全局范围不允许使用常规语句 对于为什么不允许这样做,

我想知道是否有人可以解释以下错误的含义:

代码

    #include "sstream"

    std::stringstream h;

    h.str(""); //clearing the stringstream object

    int main()
错误

kial.cpp:5:1:错误:“h”未命名类型h.str(“”)


另外,为什么尝试访问main()之外的方法是错误的?

编译器假定您尝试进行声明(或定义),因为全局范围不允许使用常规语句

对于为什么不允许这样做,简单的回答是标准中这么说的

<>想一想为什么这是答案,考虑你希望代码执行的时间。给定已定义的程序执行顺序,在全局(或命名空间)范围内调用函数意味着什么


如果您确实需要在该范围内执行某些操作,则始终可以使用一个类的实例,该类的构造函数满足您的要求。

好的,因此每个人在这里都有一个简单的语句,说明您无法执行此操作。不要相信任何人。事实上,你可以。但不像你曾经尝试过的那样。通常,在其他函数之外不能有类似函数调用的语句。第一个被调用的函数总是
main
。但是,C++有全局对象。因此,上述规则只有一个例外——全局对象的构造和销毁。通过使用和声明某个对象全局,可以调用其构造函数,并从中执行其余操作。例如,你可以这样解决你的问题:

#include <sstream>
#include <iostream> // just for std::cout and std::endl.

std::stringstream h;

struct MyStruct {
    MyStruct() {
        h.str(""); //clearing the stringstream object
        std::cout << "`h` string stream is cleared now!" << std::endl;
    }
};

MyStruct mystruct;

int main()
{
    std::cout << "I am called AFTER MyStruct's constructor" << std::endl;
}

希望能有帮助。祝你好运-Wextra等。好吧,我现在要把它变成一种习惯。@nerorevenge在做这样的例子时,展示它也是一件好事,证明作者知道他遵守了标准,没有利用某些gnu扩展警告:这在单个文件中有效,因为来自单个源文件的全局文件是按文件顺序创建的。在这里,
h
出现在
mystruct
之前,所以它是在前面创建的。但是,不同文件中的全局文件不会以任何特定顺序创建。
$ g++ -Wall -pedantic -std=c++98 ./test.cc  && ./test
`h` string stream is cleared now!
I am called AFTER MyStruct's constructor