当我编译这个程序:
#include<iostream>
using namespace std;
std::cout<<"before main"<<endl;
int main()
{
}
我在编译时看到了这个错误:
error: 在'<<'标记之前期望构造函数、析构函数或类型转换
请帮助我理解这意味着什么,我的程序有哪些问题?
当我编译这个程序:
#include<iostream>
using namespace std;
std::cout<<"before main"<<endl;
int main()
{
}
我在编译时看到了这个错误:
error: 在'<<'标记之前期望构造函数、析构函数或类型转换
请帮助我理解这意味着什么,我的程序有哪些问题?
std::cout<<"before main"<<endl;
为了使这个程序有效,语句需要在你的 main()
函数(或其他函数)的范围内。
int main()
{
std::cout<<"before main"<<endl;
}
与您的具体问题无关,还有一个要点:由于您正在using namespace std
,因此在std::cout
上显式添加std::
是多余的。
return 0;
。这仅适用于 main
函数,所有其他函数必须返回值,如果它们的签名指定了返回类型。 - David Rodríguez - dribeas您不能进行编写
std::cout<<"before main"<<endl;
在函数外部。
-- 编辑 --
C++程序的唯一入口点是主函数。在执行主函数之前可能发生的唯一事情是静态/全局变量的初始化。
static int i = print_before_main_and_return_an_int();
cout
在 i
之前被初始化。 - David Rodríguez - dribeasstd::cout
放在了main函数之前。现在你是在问为什么这样做会出错吗? - jalf语句不能在函数外执行。
然而,如果你把用于初始化全局变量的表达式放在那里,编译器不会产生任何错误或警告,这样做是可以的。
例如,下面的代码将打印出你想要的内容:
#include <iostream>
std::ostream &gout = std::cout<<"before main"<< std::endl;
int main() { }
输出:
before main
在线演示: http://www.ideone.com/Hz4qu
这里我做的事情与这个主题中所做的几乎相同:
gout
的初始化会在std::cout
之后发生,因此可能会导致您调用未初始化的cout
上的operator<<
-> 产生未定义的行为。 - David Rodríguez - dribeasgout
是一个命名空间级别的变量,在main()
开始之前必须进行初始化。但是为了初始化它,右侧必须被执行(结果会在stdout
上打印字符串“before main”),并且返回值将作为引用存储在gout
中。明白了吗? - Nawaz您需要在函数内定义该行。
std::cout<<"before main"<<endl;
#include<iostream>
using namespace std;
你不必输入:
std::cout<<"before main"<<endl;
你可以直接输入:
cout<<"before main"<<endl;
因为你已经声明了使用命名空间std;,这可以节省一些打字时间。祝好!
operator<<
的“错误:预期未限定标识符”。 - Tamás Szelei