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