問題タブ [c89]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - ANSI C と K&R C の主な違いは何ですか?
ANSI Cに関するウィキペディアの記事には、次のように書かれています。
ANSI C 標準化プロセスの目的の 1 つは、K&R C (最初に公開された標準) のスーパーセットを作成し、その後導入された非公式の機能の多くを組み込むことでした。ただし、標準化委員会は、関数プロトタイプ (C++ プログラミング言語から借用) や、より機能的なプリプロセッサなど、いくつかの新機能も含めました。パラメータ宣言の構文も、C++ スタイルを反映するように変更されました。
それは私に違いがあると私に思わせます。しかし、K&R C と ANSI C の比較は見当たりませんでした。そのようなドキュメントはありますか? そうでない場合、主な違いは何ですか?
編集: K&R の本の表紙には "ANSI C" と書かれていると思います。少なくとも、私が家に持っているバージョンはそうだと思います。もしかして、もう差がない?
c - C での変数宣言の配置
私は長い間、C ではすべての変数を関数の先頭で宣言する必要があると考えていました。C99 のルールは C++ と同じですが、C89/ANSI C の変数宣言の配置ルールは何ですか?
gcc -std=c89
次のコードは、とを使用して正常にコンパイルされますgcc -ansi
。
C89/ANSI モードでの宣言c
とs
エラーの原因となるべきではありませんか?
c - C89、C90、または C99 のすべての関数にプロトタイプが必要ですか?
真に標準に準拠するには、C のすべての関数 (main を除く) にプロトタイプが必要です。それらが同じ翻訳単位で定義された後にのみ使用される場合でも?
c - floor() は正確に表現可能なものを返しますか?
C89 では、floor() は double を返します。以下は動作することが保証されていますか?
私の懸念は、floor の結果が IEEE 754 で正確に表現できない可能性があることです。したがって、d は 2.99999 のようになり、x は最終的に 2 になります。
この質問に対する答えが「はい」であるためには、int の範囲内のすべての整数が double として正確に表現可能でなければならず、floor は常にその正確に表現された値を返さなければなりません。
c - ANSI C89/ISO C90 における void ポインターの境界
ANSI C89/ISO C90 の void-pointer 値の上限と下限を移植可能に決定する方法はありますか? (私は現在、標準のコピーを持っていません(家に持っています)。もちろん、void-pointer の値が署名されていないことが保証されている場合、このタスクは簡単です(sizeof(void *) を介して);しかし、私はできませんこれが保証されているかどうか思い出してください. いくつかの非常に非効率なアルゴリズム (オーバーフローするまでインクリメントするなど) を思いつくことができます.これらの境界を計算します。)
- 編集 -
また、ポインター値の有効性を判断する移植可能な方法はありますか?
理由:これは同僚との話し合いの中で出てきたもので、私は困惑しました。彼が何をしているかわからないけど、興味があるから知りたいだけ!:-)
c - -std=c99 が設定されている場合、gcc が random() インターフェイスを見つけられないのはなぜですか?
私は"#include <stdlib.h>"
ソースの上部で行います。
コンパイル例:
-std=c99 をオフにすると、関数 isfinite() が見つかりません。したがって、これとその他の理由で -std=c99 を使用したいと思います。私が見逃しているトリックはありますか?
c - C89でtypedef'd構造を宣言するより良い方法は?
上記は機能しますが、より簡単な (またはより良い) 方法はありますか?
.net - VSが新しいファイルを自動的に選択するように既存のcプロジェクトのVSソリューションを作成するにはどうすればよいですか?
組み込みアプリケーションをx86に移植して、エミュレーターを作成したいと思います。VS2008を試してみることにしましたが、既存のディレクトリ構造を理解する方法と理解する方法がわかりません。
- アーチ/
- arch/hcs08-HALの実装
- arch/include-HALのパブリックインターフェイス
- arch/x86-ここにエミュレーションレイヤーを配置する必要があります
- os /
- os / src--osレイヤーのソース
- os / include--OSのパブリックインターフェイス
- アプリ/-組み込みアプリケーション
- apps / app1 / src-app1
- apps / app2 / src-app2
3つのプロジェクトが欲しいです:
- arch&os-os / 、arch / include /、arch / x86/*のすべてを含むライブラリプロジェクト
- app1-コンソールアプリプロジェクト。apps/app1/*のすべてが含まれます。
- app2-コンソールアプリプロジェクト。apps/app1/*のすべてが含まれます。
ファイルを1つずつ手動でインポートして上記の構造を作成しましたが、明らかにvsは新しいファイルを自動的に選択せず、プロジェクトはフラットです(フォルダーなし)
OSとアプリケーション層は絶えず開発されているので、新しいファイルを追加することは本当に苛立たしいことです。
VSにすべての新しいファイルを自動的に選択させ、ディレクトリ構造を維持させる方法はありますか?
私はEclipseCDTで上記に簡単にできることを知っていますが、私が言ったように、VS2008を試してみたいと思います。
c++ - 組み込み開発に C++ の代わりに C を使用する理由はありますか?
質問
私のハードウェアには、C++ と C89 の 2 つのコンパイラがあります。
クラスで C++ を使用することを考えていますが、ポリモーフィズムは使用しません (vtable を避けるため)。C++ を使用したい主な理由は次のとおりです。
- 私は、マクロ定義の代わりに「インライン」関数を使用することを好みます。
- 接頭辞がコードを乱雑にするので、名前空間を使用したいと思います。
- 主にテンプレートと冗長なキャストのおかげで、C++ の方が少しタイプセーフだと思います。
- オーバーロードされた関数とコンストラクター (自動キャストに使用) が本当に好きです。
非常に限られたハードウェア (4kb の RAM) 向けに開発する場合、C89 を使い続ける理由はありますか?
結論
あなたの答えをありがとう、彼らは本当に役に立ちました!
主な理由は次のとおりです。
- C で実際のコードを予測する方が簡単です。RAM が 4kb しかない場合、これは非常に重要です。
- 私のチームは主に C 開発者で構成されているため、高度な C++ 機能はあまり使用されません。
- C コンパイラ (C89) で関数をインライン化する方法を見つけました。
非常に多くの良い回答を提供してくれたので、1 つの回答を受け入れるのは難しいです。残念ながらウィキを作成して承認することはできないので、最も考えさせられた回答を 1 つ選択します。
c - 組み込みデバイスの C89 でバイト ストリームをパケット ストリームに変換する方法
RS232(USB経由のRS232)を使用してPCに接続されている組み込みデバイスで作業しています。
私は自分のプロトコルを開発することを考えています:
<MAGIC><LENGTH><BINARY DATA><CRC>
しかし、車輪の再発明はしたくありません。
注意してください: 私は非常に制限されたデバイスについて考えています: 4kb の RAM、カーネルなし、または標準の C ライブラリ。
これを行うための標準的な方法 (オープン ソース ライブラリなど) を考えてもらえますか?
独自のソリューションをコーディングする場合、ベスト プラクティスはありますか?
- パッケージの最後にもMAGICバイトを使っていますか?
- 区切り文字の代わりにタイムギャップを使用する方がよいでしょうか?
- ストリーム バイナリ データでパッケージの先頭を見つけるにはどうすればよいですか?
- テキストプロトコルを使用した方が良いのでしょうか?
更新: 質問を読み直してください。ライブラリを求めるのではなく、優れた実践を求めるべきです。