今回はC言語自体がどのように発展してきたのかを見ます。
・K&R 1973年 ブライアン・カーニハン+デニス・リッチー@AT&Tベル研究所
UNIXの開発時にOSの記述に便利なようにB言語を発展させて開発された。
が、UNIXが様々なプラットフォームに移植される時あるいは他のOS向けに処理系が発展するにつれ方言が多くなってしまいその後規格化されるようになり今ではほとんど使われていない。
でも、今でもこの形式の定義ができてしまったのでちょっとびっくり。
#include
int main(argc,argv)
int argc;
char *argv[];
{
printf("Hello K&R\n");
}
石田晴久先生訳の「プログラミング言語C」の第1版を持っていたはずなんですが、どっかいっちゃって見つかりません。ので、詳細は省略。
・ANSI C(
石田晴久先生訳の「プログラミング言語C」の第2版改訂訳からANSI Cでの変更点のうち興味深いものを列挙しておきます。ただし一部の機能は一部の処理系では実装済みだったものを規格に取り入れたようです。
関数プロトタイプ
キーワード追加:void/enum/const/volatile/signed
プリプロセッサでの文字列生成 #,文字列結合 ##
文字列の連結
void *型の導入/enum型の導入
定数の接尾子、L/U/F
limits.h, float.hあるいはsizeofでの処理系間互換性
など
void *はK&Rでなかったんですねえ。charが1バイト前提だったってことでしょうか。
・ISO(C90) 1990年→1993年 JIS X3010-1993
ANSIは米国国内規格なので国際標準化機関のISOで内容は同じ。さらに日本工業規格にも1993年になりました。
・ISO(C95) 1995年 Amadment1
C90への追加として制定されました。主な追加は以下です。
ワイド文字列サポート
・ISO(
その後の発展をふまえてC++の利便性なども取り入れられた新しい規格が制定され、その後日本の規格にもなりました。wikipediaから主な変更点を追加します。
インライン関数
ファイルスコープでない変数宣言がブロックの先頭になければならないという制限の撤廃
いくつかの新しいデータ型。long long int、拡張整数型, 明示的な真偽型、複素数型 など
BCPLやC++のような、//から始まる一行コメント
snprintfのような新しいライブラリ関数
stdbool.hやinttypes.hなどの新しいヘッダファイル
型総称的な数学関数 (tgmath.h)
IEEE 浮動小数のより進んだサポート
指示初期化子
可変引数マクロのサポート
最適化のための restrict 修飾子
やはり一部の処理系では先行的に導入されています。一行コメントなどは早くから各社取り入れていましたね。
神戸大学の森先生がまとめられているこのページがとてもわかりやすいです。
ANSI-CとC99とGCCの拡張文法
C99は正式に規格が決まるまでC9xと呼ばれていました。ISO規格の番号は規格制定年が入るので正式決定までは規格の番号がはっきりしなかったからということでしょうね。
■
新しい規格制定の動きもあります。生のCを規格の違いがでるほど使うことは最近ないのですが、ここで導入されたことはC++やObjective-Cにも反映されることになるのでしょうか?
■実装
実際に違いを確認するのはgccではC89,C99の規格準拠性を確認するオプションがあります。
もちろん過去に書かれたソースコードでもコンパイルできるようにする下位互換のためです。
http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Standards.html#Standards
gcc
-ansi/-std=c89
-std=iso9899:1990
-std=iso9899:199409
-std=c99/c9x/iso9899:1999/iso9899:199x
エラーを確認するためには以下のオプションと併用する必要があります。
-pedomtic
バージョンを検地するための新しいプリプロセッサ定義も定められています。
__STDC_VERSION__
#if __STDC_VERSION__ >= 199901L
/* "inline" is a keyword */
#else
# define inline /* nothing */
#endif
ラベル:C言語
【関連する記事】