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;
}
希望能有帮助。祝你好运因为这不是C++的工作原理。程序流在main中定义。其他的一切都是定义主要可以使用的东西(函数、全局变量等)。答案的一个例外——您可以创建一个全局对象,它的构造函数将被调用。在本例中,将构造函数称为stringstream h(“”)。然而,stringstream开始时是空的,所以这不是必需的。@NeilKirk请稍微简化一下,sir?h是一个全局变量,使用默认构造函数创建。您可以将其替换为std::stringstream h(“hello”);从h开始,甚至在main之外。我不得不问,为什么要挂学究式的旗帜?@nerorevenge:啊,只是一种病态的习惯,没什么大不了的。就像看到我能得到的所有警告一样,所以通常加入迂腐的,
-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