C、C99、ANSI C、GNU Cの違いは何ですか?


122

私はcodechefでプログラミングの練習を始めましたが、CとC99の違いに混乱しています。ここでCはどういう意味ですか?C89ですか?この送信の下部にある言語を確認してください。CとC99の両方が含まれています。

私はインターネット上でGNU Cと呼ばれるものを見つけました。linux/ unixシステム用の別のCはありますか?これらはANSIのC標準に準拠していますか?いくつかの場所で「C99 strict」も読んだことがあります。これは何ですか?

使用中の他のCの標準はありますか?C 4.3.2と呼ばれるものはありますか、それとも現在使用中のgccバージョンですか?

編集:

これこれこれが役に立ちました。さらに検索して、未回答の項目を編集します。

私はプログラミングの初心者ではありません。C言語とは何か知っています。C89、C99、C11のようなANSIによる異なるC標準があることを知っています。


@私はあまり検索していなかったでしょうか。今しました。もっとやります。さらに質問を編集します。
Aseem Bansal

@ C99 strictについて、およびcodechefのCがC89であるか、以前の非標準のオリジナルCであるかを見つけることができませんでしたか
Aseem Bansal

1
POSIX C について忘れないでください:-)
pmg '22年

回答:


216
  • C言語の発明者であるDennis Ritchieを著者の1人とする有名な本にちなんで、標準化前のすべては一般に「K&R C」と呼ばれています。これは1972年から1989年までの「C言語」でした。

  • 最初のC標準は、1989年に米国の国家標準機関ANSIによって米国でリリースされました。このリリースはC89またはANSI-Cと呼ばれます。1989年から1990年まで、これは「C言語」でした。

  • その翌年、アメリカの規格は国際的に受け入れられ、ISO(ISO 9899:1990)によって発行されました。このリリースはC90と呼ばれます。技術的には、C89 / ANSI-Cと同じ規格です。正式には、C89 / ANSI-Cに代わって廃止されました。1990年から1999年にかけて、C90は「C言語」でした。

    1989年以来、ANSIはC言語とは何の関係もないことに注意してください。「ANSI C」についてまだ話しているプログラマーは、一般的にそれが何を意味するのかについての手掛かりをもっていません。ISOは、標準ISO 9899を通じてC言語を「所有」しています。

  • マイナーアップデートは1995年にリリースされ、「C95」と呼ばれることもあります。これは大きな改訂ではなく、正式にISO / IEC 9899:1990 / Amd.1:1995と名付けられた技術改正です。主な変更点は、ワイドキャラクターサポートの導入です。

  • 1999年、C規格は大幅な改訂が行われました(ISO 9899:1999)。このバージョンの標準はC99と呼ばれます。1999年から2011年まで、これは「C言語」でした。

  • 2011年に、C規格が再び変更されました(ISO 9899:2011)。このバージョンはC11と呼ばれます。様々な新などの機能_Generic_Static_assertおよびスレッドのサポートが言語に追加されました。この更新では、マルチコア、マルチプロセッシング、および発現シーケンシングに重点が置かれました。2011年から2017年まで、これは「C言語」でした。

  • 2017年にC11が改訂され、さまざまな不具合報告が解決されました。この規格は非公式にC17と呼ばれ、ISO 9899:2018としてリリースされました。新しい機能は含まれず、修正のみが含まれます。これは、C言語の現在のバージョンです。


「C99 strict」は、コンパイラが文字に従って標準に従うように強制するコンパイラ設定を指します。C標準には、用語に準拠した実装があります。基本的には、「このコンパイラは実際にはC言語を正しく実装している」という意味です。C言語を正しく実装するプログラムは、正式に厳密準拠プログラムと呼ばれます

「GNU C」には2つの意味があります。GNUコンパイラコレクション(GCC)の一部として提供されるCコンパイラ自体。または、GCC Cコンパイラが使用する非標準のデフォルト設定を意味する場合もあります。でコンパイルする場合gcc program.c、C標準に従ってコンパイルするのではなく、非標準のGNUセットアップをコンパイルします。これは「GNU C」と呼ばれることがあります。たとえば、Linuxカーネル全体は非標準のGNU Cで作成されており、標準Cでは作成されていません。

C標準に従ってプログラムをコンパイルする場合は、と入力する必要がありますgcc -std=c99 -pedantic-errors。GCCバージョンがサポートしている場合は、c99をc11に置き換えます。


8
厳密なコンパイラ設定は、「拡張機能を無効にする。標準で定義されたC言語のみを使用する」、または「正しくコンパイルする」以上のものを使用してください。言語の拡張を受け入れることは完全に正しいことです。それを可能にするために標準が定義されました。
Eric Postpischil 2013年

5
主にワイドキャラクターのサポートを追加したC94 / C95修正1もありました。List of Standard Header Files in C and C ++も参照してください。
ジョナサンレフラー2013年

2
あなたは、C90からC99に多くのことが変わったと書いています。いくつか挙げてもらえますか?
Martin Thoma

3
@LundinがK&Rの間違った本をリンクしました。これは、C89標準を説明する第2版です。
Antti Haapala、2015

5
ええ、でも要点は、それまでCプログラミング言語を定義したバージョンではないということです。どこでも販売されるというわけではありません。
Antti Haapala 2015

7

私はANSI Cに関して応答しなければなりません。ANSIはそれで何もしていませんが、コンパイラはまだそれに組み込まれています。たとえば、PIC XC16コンパイラ:「コンパイラは、ANSI仕様(ANSI x3.159-1989)で定義され、Kernighan and RitchieのCプログラミング言語(第2版)で説明されているANSI C標準に準拠する完全に検証されたコンパイラです。 ...」すべてのプログラミングがPCのような「大規模」コンピュータ用であるとは限りません。デバイスのコストに合わせてコンパイラを作成し、検証に時間と$がかかります。ANSI Cは、組み込み/リアルタイムデバイスで正常に動作しています。


4
  • ANSI C:最初のC言語は、1989年にANSIと呼ばれる機関によって標準化されたので、c89と呼ばれています。

  • C99:
    開発者の要求に応じて、1999〜2000年に、追加または追加のキーワードと機能がC99に含まれました(例:インライン、ブール値。浮動小数点アーテマティックライブラリ関数が追加されました)。

  • GNU C:GNUはUNIXに似たオペレーティングシステム(www.gnu.org)です。GNUのプロジェクトには、ANSI C標準に基づくCプログラミング言語が必要です。GNUはGCC(GNUコンパイラコレクション)コンパイラを使用してコードをコンパイルします。これには、malloc、calloc、exitなどのシステムコールを定義するCライブラリ関数があります。

ANSI Cは、他の標準によって使用または参照されている標準です。


厳密及びcodechefにおけるCは、C89またはそれ以前の非標準原CであるかどうかC99について何か
Aseem Bansal氏

修正:ANSI Cは廃止された規格であり、古くなったドキュメントによってのみ参照されます。C言語はISO C、またはISO / IEC 9899:2011と呼ばれる場合に呼ばれます。
ランディン

1

ランディンの回答に加えて

デニス・リッチーが 尋ねられたときに言うべきことは次のとおりです

「K&RがK&R第2版を書く前に、承認された最終的なANSI規格を待たなかったのはなぜですか?」

K&RがK&R第2版を書く前に、承認された最後のANSI規格を待たなかったのはなぜですか?この本は、最終的なANSI規格に取って代わられる前の数か月間だけ正しい規格になるようです。この後半の段階でいくつかの大きな変更がある可能性が高いことはわかっていますが、3版をほとんどすぐに作成したり、廃止したりするのではなく、数か月待って100%正しくなるようにしてください。

初版10周年を迎えるのはいいことだと思いました。もっと真剣に、私達には時間と傾向があったので昨年の夏に仕事を始めました、そしてそれはX3J11が終わりに近づいているように見えました。12月と1月に終わりに近づいていたため、重要な変更の可能性があるため配信を延期する必要があるかどうかを検討し、(発行者とこの問題について話し合った後)待つ価値はないと判断しました。PHはそれを望んでおり、ブライアンも私もそれを私たちの議題から外したいと思っていました。

規格に変更があったとしても、それらが新版を保証するのに十分なほど広範であるとは想像しがたい。(もしそれが続いたとしても、私たちは何とかしてnoaliasに対処する準備ができていました。)将来の印刷で必要な変更を行う準備ができていますが、それらがマイナーであると期待する理由があります。X3J11のメンバーも、意外な人なしで終了することを非常に切望しています。結局のところ、それらの多くは、ANSIコンパイラを準備している企業のために機能します。

デニス・リッチー


1
デニス・リッチーは、コンパイラがエイリアスの有用な形式を認識しようとする努力をしてはならないことを暗示するためにエイリアス規則がどのように使用されるかを理解していませんでしたが、代わりに、鈍いコンパイラによってコードが壊れているプログラマはコンパイラに「感謝」するべきだと主張しました彼らに彼らのコードが「欠陥がある」ことを示す-そうでなければ、彼はそのようなルールをプッシュする人々に、標準の最小要件を超えてエイリアシングをサポートすることを拒否するとコンパイラーがいくつかの目的に適さなくなり、エイリアシングに対する低レベルのコードの必要性があることを明確にするように言ったかもしれない欠陥ではありません。
スーパーキャット2017年

@supercat私は実際にエイリアシングルールが何を意味するのか理解できませんでした。
スラジュジャイン

1
元のコンセプトはint i; int test(double *p) { i=1; *p=2.0; return i; }、コンパイラーのような特定のコードは、のアドレスを保持する可能性のあるオフの機会にi書き込み後にリロードする必要がないことでした。完全に合理的です。問題は、現代のコンパイラはへの書き込みがあること仮定を正当化するために同じルールを使用することで影響しません、両方のタイプが同じサイズと表現していた場合でも、その二つの構造が共通の初期シーケンスを共有している場合でも、コードは決して使用しもう一方を介して書き込まれたCISメンバーを読み取るための1つのタイプのポインター。*ppilong*long long
スーパーキャット2017年

-2

この質問は答えをネットで完全に検索していませんでした、とにかくこれを見てください:

  1. Cは、AT&T Bell Labsで1969年から1973年の間にDennis Ritchieによって最初に開発された汎用プログラミング言語です。
  2. C99は、ISOによって公開され、1999年頃にANSIによって採用されたC言語の標準です。
  3. GNU Cはc89の拡張機能ですが、c99の一部の機能も追加されていますが、全体的にはc99標準とは異なるため、gccでコンパイルするとき-std=c99は、他の回答ですでに言及されているように入力する必要があります。
  4. ANSI Cは、ANSIによってリリースされた一連の標準です。

今ネットで検索しました。質問を編集しました。質問を投稿する前に、CおよびANSI標準について知っていました。特定のことに関して混乱しています。もっと正確にしようと思います。
Aseem Bansal

厳密及びcodechefにおけるCは、C89またはそれ以前の非標準原CであるかどうかC99について何か
Aseem Bansal氏

4
この回答には多くのエラーが含まれています。C99はISOによって1999年頃に定義された規格です。C言語は23年間国際的に標準化されています。したがって、ANSIはそれとは何の関係もありません。24年間、C標準に触れていません。最近では、アメリカ市場向けのISO規格を印刷して配布するだけです。
ランディン

@ランディンああ!! ええ、私は実際にはそうではない「定義された」と書いたのですが、そこに「採用」されるべきです。 ISOによってリリースされ、ANSIによって採用されました。答えは尋ねられるほど簡単です。そのため、答えを短くしていくつかのことを述べました。
0decimal0 2013年

1
なお、gccサポート-std=c89-std=gnu89し、-std=c99かつ-std=gnu99(かつ現代的な十分なバージョンがサポート-std=c11して-std=gnu11)。違いは、標準Cの拡張機能が自動的に、またはソースがコンパイラーに適切なマクロ(など-D_XOPEN_SOURCE=700)を提供するように指示した場合にのみ使用可能になることです。
ジョナサンレフラー2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.