10

c89 と c99 を使用して次のプログラムをコンパイルすると、違いはありますか? 同じ出力が得られます。両者の間に本当に違いはありますか?

#include <stdio.h>

    int main ()
    {
      // Print string to screen.
      printf ("Hello World\n");
    }

gcc -o helloworld -std=c99 helloworld.c 
vs
gcc -o helloworld -std=c89 helloworld.c 
4

3 に答える 3

28
  • //コメントは C89 の一部ではありませんが、C99 では問題ありません。
  • main()値を返さずに落ちることreturn 0;は C99 と同じですが、C89 ではそうではありません。N1256 (pdf)、5.1.2.2.3p1 から :

    関数の戻り値の型が とmain互換性のある型である場合int、メイン関数への最初の呼び出しからの戻りは、関数exitによって返された値mainを引数として関数を呼び出すことと同じです。}関数を終了するに到達するとmain、値 0 が返されます。

したがって、コードには C89 では未定義の動作があり、C99 では明確に定義された動作があります。

于 2010-02-16T05:56:49.683 に答える
6

理論的には、1つの違いがあるはずです。「//」を使用してコメントをマークすることはC89の一部ではないため、C89規則を正しく適用すると、コンパイラエラーが発生します(-ansi -pedanticを使用すると、それが発生する可能性がありますが、覚えていません。承知しました)。

ただし、これで一般的な特性がわかります。プログラムがC89としてコンパイルされる場合、通常はC99としてもコンパイルされ、まったく同じ結果が得られます。C99は主に、C89にはないいくつかの新機能を購入するため、(たとえば)C89では許可されていない可変長配列を使用できます。

ただし、すべての違いを確認するには、ペダンティックルールの適用を要求する必要がある場合があります。C99は既存のプラクティスを標準化することを目的としており、既存のプラクティスの一部はgcc拡張であり、一部はデフォルトで有効になっています。

于 2010-02-16T05:44:02.360 に答える
2

このフォーラムでhttp://www.velocityreviews.com/forums/t287495-p2-iso-c89-and-iso-c99.html私はこれを見つけました:

概要:99は標準化されており、新しいキーワード、新しい配列、複素数、ライブラリ関数などがあります。より多くのコンパイラーは、これまでずっとそうしてきたので、c89が完成しています。

A)ANSIX3.159-1989。これは、1989年12月付けの元の1989 C標準であり、理論的根拠があります。言語の本体についてはセクション3で説明し、「Cライブラリ」(stdio、関数など)についてはセクション4で説明します。

B)ISO 9899:1990。これは元のISOC標準です。「ANSI」は米国規格協会であるため、国際的な群衆は、独自の異なる番号付けシステムを備えた独自の規格を持っている必要があります。彼らは単にANSIの1989規格を採用し、理論的根拠を削除し、セクションの番号を付け直しました(代わりに「条項」と呼びます)。ごくわずかな例外を除いて、3つ追加するだけで、ほとんどの言語がセクション-er、 "clause"-6、およびセクション7の"Cライブラリ"の部分で説明されます。

C)ISO 9899:1999。これは、可変長配列、柔軟な配列メンバー、「restrict」や「_Bool」などの新しいキーワード、「static」キーワードの新しいセマンティクス、匿名集計を作成するための新しい構文、新しい複素数を備えた、新しい「C99」標準です。タイプ、何百もの新しいライブラリ関数など。

新しいISO規格は、ANSIによってすぐに「逆採用」されました。これに関する公式の「ANSI認可」の主張は見たことがありませんが、通常の番号付けシステムを考えると、これはANSI規格番号X3.159-1999であると予想されます。(番号付けシステムは非常に明白です。標準は、公開されると、番号(ANSIの場合はX、またはISOの場合は単に番号)と発行年を示す接尾辞を取得します。既存の標準を更新すると、番号、新年付き。)

X3.159-1989と9899:1990は年とセクション番号が異なりますが、実質的に同じであるため、「C89」と「C90」は実際には同じ言語を指します。したがって、「C89」または「C90」のいずれかを言うことができ、すべての微妙なことを知っている人にとっても同じことを意味します。

また、元の1990 ISO規格には、「規範的正誤表1」と2つの「技術的正誤表」(番号付き、技術的正誤表1とTC2を与える)という小さな改訂がいくつかありました。2つのTCは、標準の文言の不具合に対する「バグ修正」と見なされますが、NA1は実際の「変更」です。実際には、TCは実際にはユーザーに影響を与えませんが、NA1はユ​​ーザーが使用できる多数の機能を追加するため、NA1は実際にはより重要です。NA1は1994年に発売されたため、「NA1によって変更されたISO 9899:1990」を「C94」と呼ぶ場合があります。「C95」という名前も見ました。

于 2010-02-16T05:45:54.353 に答える