質問

私は古いスタイルの C に慣れており、最近 c99 の機能を探索し始めたところです。質問が 1 つだけあります。プログラムで c99 を使用し、c99 フラグに gcc 以前の c99 ライブラリとリンクしますか?

では、古い C89 に固執するべきか、それとも進化すべきでしょうか?

役に立ちましたか?

解決

私は、彼らがその点で互換性があることを信じています。それはあなたが反対コンパイルしているものは新しいグッズのいずれかにステップしない限りです。古いコードはenum bool { false, true };が含まれている場合たとえば、あなたが困っています。同様の恐竜として、私はゆっくりとC99の素晴らしい新世界を採用しています。結局のところ、それは今だけ、約10年間にわたり潜んアウトがあった;)

他のヒント

あなたは進化する必要があります。リスニングをありがとう: - )

実は、私はその上で拡大します。

あなたはC99は、かなり長い間の周りされていることですね。あなたは(私の意見で)のレガシーコード(あなただけのバグを修正するのではなく、新機能を追加する場所)以外のためにその標準を使用する必要がありますを。それはおそらく、レガシーコードのためのそれだけの価値はありませんが、あなたは(すべてのビジネス上の意思決定のように)あなた自身の費用/便益分析を行う必要があります。

私はまだ新しい機能のいずれかを使用していないが、私はそれが中断されませんことを確認してみてください。

-

私はすでに私の新しいコードはC1Xと互換性が確保しています。

のために外を見るにどのようなコードについては、標準規格の著者は、の非常にの真剣下位互換性を取ります。彼らの仕事は、新しい言語を設計するために、これまでありませんでした、それは既存の慣行を成文化することでした。

彼らは現時点でにいる相は、言語を更新し、それらにいくつかのより多くの自由度を可能にするが、彼らはまだ彼らの出力の面でヒポクラテスの宣誓に従ってください:「まず、何の害もしない」

。 あなたのコードは、新しい規格で破壊された場合は、

一般的に、コンパイラはあなたを伝えることを余儀なくされます。だから、単にあなたのコードベースをコンパイルすることは素晴らしいスタートとなります。しかし、あなたは C99根拠文書する 、あなたが現れるフレーズ「静かな変更」を参照してくださいよ - 。これはあなたが注意する必要があるものです。

これらはあなたがについて通知する必要はありませんし、アプリケーションが奇妙な行動を開始した場合に多くの不安や歯ぎしりの源であってもよいコンパイラにおける行動の変化です。ビット「C89での静かな変化を」心配してはいけない - 彼らはproblermた場合、あなたはすでに彼らに刺されていたであろう。

その文書は、方法によって、実際の標準は、それが言うこと言う理由を理解するための優れた読み取りです。

敬意を表して: 試してみて見つけてください。 :-)

ただし、コンパイル上の小さな相違点をいくつか修正する必要がある場合でも、おそらく上に進む価値があることに留意してください。

明示的なC99の機能に違反していない場合は、

、C90のコードは、他の従来のC99ライブラリと細かいC99フラグを動作します。

しかし、確かに動作しません。

,,のようなC89でのいくつかのDOSベースのライブラリがあります

C99ははるかに柔軟性があるので、移行気軽に: - )

Cライブラリとの呼び出し規約は、年齢に変更されていない、実際に、私はそれが今まで持っているかわからない。

C APIはOSの部分との間に接着剤であることを傾向があるので、この時点では、

オペレーティングシステムはC呼び出し規約に大きく依存しています。

だから、基本的には答えは「はい、バイナリが後方互換性があります。いいえ、当然、C99の機能を使用してコードを後で非C99コンパイラでコンパイルすることはできません。」される

後方互換性を持つように意図しています。これは、多くのベンダーが既に実装されている拡張子を形式化。これは、C99でコンパイルするときだけでなく書かれたプログラムは、すべての問題を持っていないことも考えられるかもしれない、可能です。

私の経験では、時間を節約するためにいくつかのモジュールではなく他人を再コンパイル...は、多くの時間を無駄にします。通常、いくつかは簡単にそれを作るための新しいコンパイラを必要とし、詳細を見落としているすべての互換ます。

曖昧書かれている、と1つのポインタと、彼らがアクセスしているオブジェクトの型についてのルールをどのように解釈するかに応じて、標準は2つの非常に異なる言語のいずれかを説明するものとして見ることができるC89標準のいくつかの部分があります--oneは、意味的にはるかに強力とフィールドの広い範囲の結果として使用可能であり、のいずれかは、コンパイラベースの最適化のためのより多くの機会を可能にします。 C99標準は、それが圧倒的に多くの分野で好まれていても、それはかつての言語との互換性を強制する努力をしないというルールを明確にするために、「明確に」。それはまた、C89で定義されたが、C89のルールは、それらを禁止に正確に十分に書かれていなかったという理由だけでいくつかのものとして未定義扱います(例えば、先がヒープの持続時間を有する場合のタイプpunningためmemcpyの使用)。

C99は、このように、その著者はC89によって記載された考え言語と互換性があるが、1990年代を通じて最もC89コンパイラによって処理された言語との互換性がないことがあります。

一部の C89 機能は C99 では無効です

おそらく、これらの機能は歴史的な理由からのみ存在しており、最新の C89 コードでは使用すべきではありませんが、実際には存在します。

C99 N1256 標準ドラフト 序文の段落 5 では、C99 と古いリビジョンを比較しており、制限事項よりもはるかに多くの拡張機能があるにもかかわらず、これらの非互換性を探すのに適した場所です。

暗黙的な int 戻り値と変数型

コメントで Lutz によって言及されました。以下は有効な C89 です。

static i;
f() { return 1; }

ただし、C99 では次のように記述する必要があります。

static int i;
int f() { return 1; }

これにより、C99 ではプロトタイプなしで関数を呼び出すこともできなくなります。 C89、C90、または C99 のすべての関数にプロトタイプが必要ですか?

n1256 さんはこう言います。

暗黙的な int を削除する

非 void 関数の場合は式なしで戻ります

有効な C89、無効な C99:

int f() { return; }

C89では実装定義の値を返すと思います。n1256 さんはこう言います。

値を返す関数では式なしの return は許可されません

負のオペランドを使用した整数除算

  • C89:実装で定義された方向に丸めます
  • C99:0に丸めます

したがって、コンパイラが次のように丸めると、 -inf, 、実装で定義された動作に依存していた場合、コンパイラは C99 でコードを強制的に破壊することになります。

https://stackoverflow.com/a/3604984/895245

n1256 さんはこう言います。

信頼できる整数除算

Windows の互換性

現実的な大きな懸念事項の 1 つは、Windows でコンパイルできるかどうかです。 C99 を完全に早期に実装するつもりはない.

たとえば、これが libgit2 の理由です 許可される制限 C99 機能.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top