| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 405 人关注过本帖
标题:【讀書】關於頭文件(Header File)的擴展名
取消只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
结帖率:100%
收藏
 问题点数:0 回复次数:1 
【讀書】關於頭文件(Header File)的擴展名
《C++標準庫》(第2版)P.40-41:

將C++標準庫的所有標識符都定義於namespace std內,這是標準化過程中引入的做法。這個做法不具有向後兼容性,因爲原先的C/C++頭文件都將C++標準庫的標識符定義於全局範圍(global scope)。標準化過程中有些class的接口也有了變動(當然,盡可能以向後兼容爲目標)。爲此,C++ standard特別引入一套新的頭文件命名風格,這麽一來組件供應商便得以借由“提供舊式頭文件”達到向後兼容。

既然有必要重新定義標準頭文件的名稱,正好借此機會把頭文件的擴展名做個規範。以往頭文件的擴展名五花八門,包括.h、.hpp和.hxx。相較之下如今的標準頭文件擴展名簡潔得令人喫驚:根本就沒有擴展名。於是“欲納入標準頭文件”的include語句如下:
#include <iostream>
#include <string>

這種寫法也適用於C標準頭文件。但必須採用前綴字符c,不再使用擴展名.h:
#include <cstdlib>        // was:<stdlib.h>
#include <cstring>        // was:<string.h>

在這些頭文件中,每一個標識符都被聲明於namespace std。

這種命名方式的優點之一是可以區分舊文件頭文件中的char* C函數和新頭文件中的標準C++ class string:
#include <string>         // C++ class string
#include <cstring>        // char* function from C


注意,從操作系統的角度看,新的頭文件命名方式並非一定意味著標準頭文件沒有擴展名。針對標準頭文件而寫的include該如何處理乃是由編譯器決定。C++系統有可能自動添加一個擴展名,甚至可能使用内建聲明而根本不讀入任何文件。然而,現實中,大多數系統衹是簡單含入一個“名稱與include語句中的文件名完全相同”的文件。所以,在大部分系統中,C++標準頭文件都沒有擴展名。一般而言,爲自己所寫的頭文件加上一個適當的擴展名仍然是好主意,有助於你在文件系統中輕易識別出它們。

爲了向後兼容於C,舊式的C標準頭文件仍然有效,若有必要你還是可以使用它們,例如:
#include <stdlib.h>

此情況下標識符被聲明於全局範圍內,也聲明於namespace std中。事實上這些頭文件的行爲類似“先在std中聲明所有標識符,再明白使用using namespace把這些標識符引入全局範圍。”

至於<iostream.h>這一類C++舊式頭文件,標準書中並未加以規範,這也意味著它們不再受到支持。現實中大多數廠商會提供它們,以求向後兼容。請注意,除了引入namespace std,頭文件中還有很多改變。所以,要麽就採用頭文件舊名,要麽就應該完全改用新的標準名稱。
搜索更多相关主题的帖子: standard 兼容性 接口 命名 
2015-11-07 15:53
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
現在市面上的編譯器,絕大多數是C/C++編譯器,即本身是C++編譯器,但由於C++是從C上發展起來的,語言宣稱向後兼容C,所以C++編譯器一般都能直接編譯C代碼,這就是上文書中所說兼容性的原因。C++編譯器能編譯C代碼,故有些編譯器可以在某些情況下,蛻化爲純粹的C編譯器,比如vc++就可以在源程序文件擴展名是.c的時候蛻化爲C編譯器,此時,很多C++語言的特色語法失效,比如聲明語句不再可以位於函數體内任意位置,這本來是C++開發時針對C缺陷而引入的,C99標準吸納了而已,然而,C++編譯器儘管可以蛻化爲C編譯器,但廠商並沒有宣稱其產品蛻化使用必須支持C語言的新標準,它能蛻化已經是恩賜,究其實,vc++不支持C99這個舉動,就是表態不縱容程序員再用自己的產品寫C程序,由於C++兼容C,所以它鼓勵程序員直接使用C++編譯器編譯C代碼,而不是使用C編譯器編譯C代碼,這樣,很多C++針對C權限而作的修改都得以滿足,犯不着再冒不安全的風險製作帶缺陷的程序。諸如scanf()這類舉世公認不安全的標準庫函數,不用也罷。

用C++編譯器寫C風格的程序,其實上文書中也是多次提到的,用c前綴的頭文件,屬於C風格庫,你那樣用就是了,並不是說看起來不是與遠古時代教誨的那樣就不是C代碼了。做人應該懂認識本質,而不是光看表面。

授人以渔,不授人以鱼。
2015-11-07 16:24
快速回复:【讀書】關於頭文件(Header File)的擴展名
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025151 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved