使用 .h 扩展名

Using the .h extension

本文关键字:扩展名 使用      更新时间:2023-10-16

我是一名正在学习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 newoperator 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()不是一个好主意。