問題タブ [c99]
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 - C (C++ ではない) の例外ライブラリ
私は C 用に独自の例外ライブラリを展開しており、良い例を調べたいと思っています。
これまでのところ、私は David Hanson のものを見てきました: http://drhanson.net/work/
しかし、私は過去に利用可能な他のものを見たことがあることを知っています. 追加の指針を送ってもらえますか?
ありがとう、
SetJmp
c - ポインタへのポインタに関するC99の「制限」のセマンティクスは何ですか?
restrict
私は多くの行列演算を行っており、C99 のポインター修飾子を利用したいと考えています。
次のように、マトリックスをポインターへのポインターとして設定して、添字を簡単に付けられるようにしたいと思います。
さて、行列乗算関数
引数の両方のポインターを制限付きとして修飾する必要がありますか? int *restrict *restrict
これは有効な構文ですが、 と異なる動作をするかどうかを判断するのに苦労していint **restrict
ます。
次に、ポインターが適切に制限されている場合、A[0][col*nrows + row]
未定義を介して要素にアクセスしていますか? (つまり、コンパイラは、そのようなの値に対してのみ行列にアクセスすると想定しますか?) それとも、単に一貫性を保つ必要がありますか?A[col][row]
row
row < nrow
c++ - UINT32_MAX に相当する C++ は何ですか?
C99 では、stdint.h
andを含めることで、データ型UINT32_MAX
だけでなくuint32_t
データ型も取得できます。ただし、C++ ではUINT32_MAX
定義されます。__STDC_LIMIT_MACROS
をインクルードする前に定義できますstdint.h
が、既に自分自身をインクルードした後に誰かが私のヘッダーをインクルードしている場合、これは機能しませんstdint.h
。
では、C++ では、a で表現可能な最大値を見つける標準的な方法は何uint32_t
ですか?
c - C での仮定義とリンク
2 つのファイルで構成される C プログラムを考えてみましょう。
f1.c:
f2.c:
C99 標準のパラグラフ 6.9.2 を読んだところでは、このプログラムは拒否されるべきだということです。6.9.2 の私の解釈では、 variablex
は で暫定的に定義されていますが、この暫定的な定義は翻訳単位の最後で実際の定義になるため、(私の意見では)定義が含まf1.c
れているかのように動作するはずです。f1.c
int x=0;
私が試すことができたすべてのコンパイラ(そして重要なことに、リンカー)で、これは起こりません。私が試したすべてのコンパイル プラットフォームは上記の 2 つのファイルをリンクしておりx
、両方のファイルで の値は 2 です。
これが偶然に起こったのか、それとも標準が要求するものに加えて提供する「簡単な」機能として起こったのかは疑わしい. 考えてみれば、明示的にゼロに初期化されたものとは対照的に、イニシャライザを持たないグローバル変数に対するリンカーでの特別なサポートがあることを意味します。いずれにせよ、Fortran をコンパイルするにはリンカ機能が必要かもしれないと誰かが私に言いました。それは合理的な説明でしょう。
これについて何か考えはありますか?標準の他の解釈?f1.c
ファイルとf2.c
リンクを拒否するプラットフォームの名前は?
注: 質問は静的分析のコンテキストで発生するため、これは重要です。2 つのファイルが何らかのプラットフォームでリンクされることを拒否する可能性がある場合、アナライザーはエラーを表示する必要がありますが、すべてのコンパイル プラットフォームがそれを受け入れる場合、それについて警告する理由はありません。
c - 人間は制限修飾子から何を作ることができますか?
C99restrict
キーワードを正しく取得した場合、ポインターをそれで修飾すると、ポインターが参照するデータが、エイリアシングによってコンパイラーの背後で変更されないことが約束されます。
対照的に、私がconst
修飾子を理解する方法は、特定のオブジェクトがコードを書いている人間の背後で変更されないというコンパイラーによって強制されたドキュメントです。コンパイラーは副作用としてヒントを得るかもしれませんが、プログラマーとして私は本当に気にしません。
restrict
同様の方法で、関数プロトタイプの修飾子を、ユーザーが呼び出し中に排他的アクセスを保証する(「エイリアシングを回避する」、またはおそらくより強力なもの)という要件と見なすのが適切でしょうか?「ドキュメンテーション」として使用する必要がありますか?
restrict
また、(そうであるように)ポインターが指すデータではなく、ポインターを修飾するという事実に理解すべきことがありconst
ますか?
編集:私は当初、それがスレッデッドコードに影響を与える可能性があると信じていrestrict
ましたが、これは間違っているように思われるので、読者を混乱させないように、質問からスレッドへの参照を削除します。
c - C プリプロセッサは最初にコメントを削除したり、マクロを展開したりしますか?
この (恐ろしい、ひどい、良くない、非常に悪い) コード構造を考えてみてください。
このコードでは、2 つのコンパイラのプリプロセッサが異なる結果を生成するのを見てきました。
と
明らかに、これは移植可能なコード ベースにとっては悪いことです。
私の質問: プリプロセッサはこれに対して何をすべきですか? 最初にコメントを削除するか、最初にマクロを展開しますか?
c - Visual Studio でヘッダーを自動同期する方法は?
Microsoft Visual Studio 2008 に、C ヘッダーを簡単に生成し、対応する .c ヘッダーとの同期を維持する組み込み機能または無料のアドインがあるかどうか知っていますか? 私はすでに Visual Assist X を見てきましたが、現時点ではお金を払う気はありません。
c - バッファオーバーランを超えないようにするscanf
バッファがあり、バッファが保持できるよりも多くの文字をユーザーに入力させたくありません(バッファオーバーランを回避するため)。
私はscanf
このように使用しており、次のようにしています。
ただし、ユーザーが30を超えて入力した場合、保護されていることはわかっています。ただし、ユーザーが30を超えて入力した場合、バッファーはnullで終了しますか?
c - MSVC ++ 6で「ilogbf」のようなIEEE数学関数を宣言するにはどうすればよいですか?
誰かが助けて、MSVC ++ 6にIEEE数学関数を含める方法を教えてもらえますか?との両方を試しましたが、それでも次のエラーが発生します。
エラーC2065:'ilogbf':宣言されていない識別子
エラーC2065:'scalbnf':宣言されていない識別子