我是一名正在学习C ++的学生。我已经浏览了互联网上的教程。所有这些都在一些包含文件之后不使用.h扩展名,例如
#include <iostream>
但我的C ++讲师说我必须在iostream之后添加.h扩展名,例如:
#include <iostream.h>
我的书“Waite Group的Turbo C ++中的面向对象编程”由Robert Lafore编写,也告诉我在iostream之后加上.h扩展名。我的讲师和书中都说使用cout和cin函数时不需要使用以下代码。
using namespace std;
使用cout和cin函数时,需要命名空间std,对吗?如果我尝试做书和讲师讲的话,我的编译器(g ++)会给我错误。该书还说要使用
void main()
而不是
int main()
如果我按照讲师或书中的说法进行操作,我会在编译时遇到错误。怎么了?我在Linux Mint 17上使用g ++进行编译。
答案 0 :(得分:11)
你的讲师和他的书不正确/取决于20年前的情况。
在C ++于1998年标准化之前,许多编译器(或者更确切地说:他们的库实现)确实知道了一个头<iostream.h>
,其中标准C ++中名称空间std
中的几个符号存在于全局命名空间。从编译器到编译器的哪些符号完全不同,就像当时的许多事情一样。这些头文件没有包含在1998年的C ++标准中,也没有包含在它们之后的任何标题中。今天,最近的编译器将完全拒绝试图使用它们的代码。
但这并不能说服你的讲师在过去的15年里他错了,所以你可以告诉他(如果你相信这样做不会让你成为生命的敌人):
This是指向C ++ 11标准的最新公开草案的链接,您可以合理地期望它能够在今天使用。打开它,转到第429页(或搜索 [标题] ),看到列出<iostream>
而<iostream.h>
未列出。
请参阅 [内容] 中页面428 的底部,标准库的符号位于命名空间std
中:
除了宏
operator new
和operator delete
之外的所有库实体都在命名空间std
中定义,或者命名空间嵌套在命名空间std
中。 (...)
此外,关于main
功能,请转到第61页(或搜索 [basic.start.main] )以查看{{1}不允许:
实现不应预定义
void main
函数。此功能不应过载。 它的返回类型应为main
,但其类型是imlementation-defined。所有实现都应允许int
的以下两个定义:
main
和
int main() { /* ... */ }
(...)
(强调我的)
答案 1 :(得分:4)
这本书似乎非常过时了。获得new one。
不要写<iostream.h>
,<iostream>
是正确的(所有标准标题都相同)。
不要使用using namespace std;
,here就是原因。请改用std::cout << "Hello World\n";
等完全限定名称。
您的主要应该是int main ()
或int main (int argc, char **argv)
,具体取决于您是否要处理命令行参数。
另外,不要使用TurboC ++,它非常过时。
答案 2 :(得分:-1)
根据我的知识和我上次教授告诉我们的内容:
您可以选择是否包含.h
。 .h
通常是旧版本。您现在可以再次使用using命名空间。 (这并不意味着这是一种很好的做法,但作为一名学生,很多学校都允许这样做。)
有些书籍使用命名空间解释,有些则没有。
那么使用命名空间而不使用命名空间有什么区别?
以cout
为例。如果您在代码的开头使用了命名空间std。你可以这样做:
cout << "hello" ;
但是,如果您没有添加第using namespace std;
行。你必须这样写:
std::cout << "hello";
顺便说一下,当我在大学时,我们总是在学校里使用int main()
。我认为void main()
不是一个好主意。