問題タブ [c-preprocessor]

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.

0 投票する
18 に答える
39228 参照

c - C マクロは何に役立ちますか?

私は C を少し書いたことがあり、C が何をしているのかを理解するのに十分なほど十分に読むことができます。マクロが何であるかを覚えておき、読みながら頭の中で代用する必要があります。私が出会った直感的で分かりやすいものは、いつも小さな小さな機能のようなものでした.

プリプロセッサでデバッグまたはクロスプラットフォーム ビルド用にさまざまなビルド タイプを定義する必要があることは理解できますが、任意の置換を定義する機能は、すでに難しい言語をさらに理解しにくくするためにのみ役立つようです。

C にこのような複雑なプリプロセッサが導入されたのはなぜですか? そして、単純な if #debug スタイルの条件付きコンパイル以外の目的でまだ使用されているように見える理由を理解できる使用例はありますか?

編集:

いくつかの回答を読んでも、まだわかりません。最も一般的な答えは、コードをインライン化することです。inline キーワードがそれを行わない場合は、それを行わない正当な理由があるか、実装を修正する必要があります。「このコードを実際にインライン化する」ことを意味するまったく異なるメカニズムが必要な理由がわかりません(インライン化の前に書かれたコードは別として)。また、「関数に入れるにはばかげている場合」という考えも理解できません。確かに、入力を受け取って出力を生成するコードは、関数に入れるのが最適です。私は C 言語のマイクロ最適化に慣れていないので、理解できないかもしれませんが、プリプロセッサは、いくつかの単純な問題に対する複雑な解決策のように感じます。

0 投票する
3 に答える
65912 参照

c++ - C++ での WIN32 定義と _WIN32 定義の違いは何ですか?

WIN32win32 コンパイルを意味することは知っていますが、何に_WIN32使用されますか?

0 投票する
6 に答える
213810 参照

c - 可変個引数マクロの作り方(引数の数が可変)

特定の数ではなく、任意の数のパラメーターを受け入れるマクロを C で作成したい

例:

X任意の数のパラメータ

whateverオーバーロードされており、2 つまたは 4 つのパラメーターで呼び出すことができるため、これが必要です。

マクロを 2 回定義しようとしましたが、2 回目の定義で最初の定義が上書きされました。

私が使用しているコンパイラは g++ (具体的には mingw) です。

0 投票する
2 に答える
1724 参照

c - C スタイル: マクロまたはプリプロセッサ?

文字列を一連のパターンと照合するためのライブラリを作成しました。これで、レキシカル スキャナーを C プログラムに簡単に埋め込むことができるようになりました。

レキシカルスキャナーを作成するために利用できる確立されたツールがたくさんあることを私は知っています(頭に浮かぶ最初の2つに名前を付けると、lexとre2c)。レクサーの例は、一般的な問題の具体的なケースにすぎません。

考えられる解決策は 2 つあります。

  1. 埋め込まれた字句解析器を含むソース ファイルをプレーンな C ファイルに変換するプリプロセッサを作成し、場合によっては、コンパイルで使用される他のファイルのセットに変換します。
  2. より読みやすい形式でレクサーを表す一連の C マクロを作成します。

私はすでに両方を行っていますが、質問は次のとおりです。

  • 読みやすさ。レクサーのロジックは明確で理解しやすいものにする必要があります
  • 保守性。バグを見つけて修正するのは悪夢ではありません。
  • ビルド プロセスの干渉。プリプロセッサは、ビルド プロセスで追加の手順を必要とし、プリプロセッサはパス内に存在する必要があります。

言い換えれば、2 つのアプローチのいずれかを使用するソフトウェアを保守または作成する必要がある場合、失望が少ないのはどちらでしょうか?

例として、次の問題のレクサーを次に示します。

  • すべての数値を合計します (1.3E-4.2 のような指数を含む 10 進数形式にすることができます)
  • スキップ文字列 (二重引用符と一重引用符)
  • スキップ リスト (LISP リストと同様: (3 4 (0 1)() 3) )
  • 単語 end (大文字と小文字は区別されません) に遭遇するか、バッファの最後で停止します

2つのスタイルで。


現在の実装に興味がある方は、コードはhttp://sites.google.com/site/clibutlにあります。

0 投票する
2 に答える
5644 参照

c# - プロジェクト全体でプリプロセッサ シンボル (DEBUG など) をグローバルに宣言する

次のように、NUnit と VS テストを切り替えたいと思います。

私の質問は、NUnit と VSTests を簡単に切り替えるために、NUNIT プリプロセッサ シンボルを 1 か所 (App.config などが最適) で宣言するにはどうすればよいですか? を使用する#define NUNITと、それが書き込まれたファイルに対してのみ機能するためです。

0 投票する
10 に答える
146999 参照

c# - プリプロセッサでのC#マクロ定義

C#は、プリプロセッサステートメントを使用してCプログラミング言語で行われるようにマクロを定義できますか?次のような特定の繰り返しステートメントの通常の入力を簡略化したいと思います。

0 投票する
5 に答える
4007 参照

c++ - C2065 定義を int に割り当てる際の宣言されていない識別子

定義に小さな問題があります。整数変数に割り当てたいのですが、コンパイラはそれが宣言されていないと言います。

コードは次のようになります。

myclass.h

myclass.cxx

int 割り当てのある行で、コンパイラ エラーが発生します。また、上記と同じヘッダー ファイルで定義された別の定義を、同じ効果を持つ関数パラメーターとして使用しようとしました。何か案は?前もって感謝します。

define を使用するのは悪い習慣であることはわかっていますが、既存のプロジェクトを拡張するだけで、その設計方法にとどまるようにしています。

編集: エラー メッセージは次のFehler 1 error C2065: 'MYDEFINE': nichtdeklarierter Bezeichner ...とおりです。

EDIT2: #warning のヒントをありがとう。異なるフォルダに同じ名前のファイルが 2 つありました。コンパイラがこれを表示しなかった理由がわかりません。とにかく、それは今動作します。

0 投票する
6 に答える
2801 参照

c - #ifdef DEBUG パーツをリリース用に削除するには?

他の誰かが見るためにソース コードをリリースするとき、コーディング スタイルが明確に定義されていない場合 (しゃれが意図されていない場合)、#ifdefDEBUG 部分を削除しますか?

(DEBUGが定義されている場合にのみコンパイルされる部分です)

それを削除すると、コードの見栄えが良くなります (または、見栄えが良くなります。デバッグしたことと、どのように実行したかを誰かに本当に知ってもらいたいですか?)。ただし、デバッグ部分が失われるか、またはコードの 2 つ (またはそれ以上) のバージョンを保持する必要があります。

何を終わらせるべきなのですか?