使用 .h 扩展名

Using the .h extension

我是一名正在学习C++的学生。我已经浏览了互联网上的教程。它们在某些包含文件后都不使用.h扩展名,例如

#include <iostream>

但是我的C++讲师说我必须在iostream之后包含一个.h扩展名,例如:

#include <iostream.h>

我的书 "The Waite Group's Object Oriented Programming In Turbo C++" 由 Robert Lafore 撰写,也告诉我在 iostream 之后放置一个 .h 扩展名。我的讲师和书上都说在使用 cout 和 cin 函数时不需要有下面这行代码。

using namespace std;

使用cout和cin函数时,需要命名空间std,对吧?如果我尝试按照书上和讲师所说的去做,我的编译器 (g++) 就会出错。书上还说要用

void main()

而不是

int main()

如果我按照讲师或书上说的去做,我在编译过程中会出错。怎么了?我在 Linux Mint 17 上使用 g++ 进行编译。

这本书似乎非常过时了。得到一个new one.

不要写<iostream.h><iostream>是正确的(所有标准头都一样)。

不要用using namespace std;here就是为什么。请改用 std::cout << "Hello World\n"; 等完全限定名称。

您的 main 应该是 int main ()int main (int argc, char **argv),具体取决于您是否要处理命令行参数。

此外,不要使用 TurboC++,它已经过时了。

据我所知和我的教授上次告诉我们的:

您可以选择是否包含在 .h 中。 .h 通常是旧版本。同样,using 命名空间现在对您来说是可选的。 (并不意味着这是一个好的做法,但作为学生,许多学校都允许这样做。)

有些书解释了 using namespace,有些则没有。

那么使用命名空间和不使用命名空间有什么区别呢?

例如使用cout。如果您在代码开头使用了命名空间 std。你可以简单地这样做:

cout << "hello" ;

但是,如果您没有添加行 using namespace std;。你必须这样写:

std::cout << "hello";

顺便说一句,我上大学的时候我们总是在学校使用int main()。我认为 void main() 不是个好主意。

你的讲师和他的书 incorrect/depend 讲述了 20 年前的事情。

在 1998 年 C++ 标准化之前,许多编译器(或者更确切地说:它们的库实现)确实知道 header <iostream.h>,其中命名空间 [=11= 中的几个符号] 在标准 C++ 中存在于全局命名空间中。哪些符号在不同的编译器之间完全不同,就像当时的许多事情一样。这些 header 没有包含在 1998 年的 C++ 标准中,以后也没有。今天,最新的编译器将完全拒绝尝试使用它们的代码。

但这并不能使你的讲师相信他在过去 15 年里是错的,所以你可以向他展示以下内容(如果你相信这样做不会让你成为终生的敌人):

This 是 C++11 标准的最后一个公开可用草案的 link,您可以合理地期望它今天能够使用。打开它,转到 第 429 页(或搜索 [headers]),看到列出了 <iostream><iostream.h> 不是。

请参阅 [内容] 第 428 页 的底部,标准库的符号位于命名空间 std 中:

All library entities except macros, operator new and operator delete are defined within the namespace std or namespaces nested within namespace std. (...)

此外,关于 main 功能,请转到 第 61 页 (或搜索 [basic.start.main]) 看到 void main 是不允许的:

An implementation shall not predefine the main function. This function shall not be overloaded. It shall have a return type of type int, but otherwise its type is imlementation-defined. All implementations shall allow both of the following definitions of main:

int main() { /* ... */ }

and

int main(int argc, char *argv[]) { /* ... */ }

(...)

(强调我的)