タグ付けされた質問 「c-preprocessor」

CおよびC ++言語プログラムをコンパイルする前に適用されるテキストマクロプロセッサ。このタグは、Objective-CまたはC#の#ディレクティブなど、同じ機能から派生した、または同じ機能を持つ他のコンパイラ/言語に関する質問にも使用できます。

8
プリプロセッサマクロが悪である理由と代替手段は何ですか?
私はいつもこれを尋ねてきましたが、本当に良い答えを受け取ったことはありません。最初の「Hello World」を書く前のほとんどのプログラマーは、「マクロは使用してはならない」、「マクロは悪だ」などのフレーズに遭遇したと思います。私の質問は、なぜですか?新しいC ++ 11では、何年も経たないうちに本当の選択肢はありますか? 簡単な部分は、のようなマクロです#pragma。これは、プラットフォーム固有およびコンパイラ固有であり、ほとんどの場合、#pragma once少なくとも2つの重要な状況でエラーが発生しやすいという重大な欠陥があります。異なるパスに同じ名前があり、一部のネットワークセットアップとファイルシステムにエラーがあります。 しかし、一般的に、マクロとその使用法の代替についてはどうでしょうか?


1
##(ダブルハッシュ)はプリプロセッサディレクティブで何をしますか?
#define DEFINE_STAT(Stat) \ struct FThreadSafeStaticStat<FStat_##Stat> StatPtr_##Stat; 上記の行はUnreal4からの抜粋であり、Unrealフォーラムで質問できることはわかっていますが、これは一般的なC ++の質問であり、ここで質問する必要があると思います。 最初の行がマクロを定義していることは理解していますが、C ++のプリプロセッサのシェナニガンに精通していないため、そこで迷子になっています。ロジックによると、バックスラッシュは宣言が次の行に続くことを意味します。 FThreadSafeStaticStatはテンプレートに少し似ていますが、そこには#があり、C ++ではこれまでに見たことのない構文があります。 誰かがこれが何を意味するのか教えてもらえますか?Unreal 4にアクセスできない可能性があることは理解していますが、それは私が理解していない構文にすぎません。

3
Cプリプロセッサを使用してintを文字列に連結
Cプリプロセッサを使用して、#define'd intを#define' d文字列に連結する方法を理解しようとしています。私のコンパイラはCentOS 5上のGCC 4.1です。このソリューションはMinGWでも機能するはずです。 文字列にバージョン番号を追加したいのですが、それを機能させる唯一の方法は、バージョン番号の定義を文字列としてコピーすることです。 私が見つけた最も近いものはマクロ引数を引用する方法でしたが、それは#defines では機能しません これは機能しません。 #define MAJOR_VER 2 #define MINOR_VER 6 #define MY_FILE "/home/user/.myapp" #MAJOR_VER #MINOR_VER #値が数値であり、に展開されるため、sがなければ機能しません。"/home/user/.myapp" 2 6これは有効なCではありません。 これは機能しますが、バージョン定義のコピーを番号としても必要とするので、私はバージョン定義のコピーが好きではありません。 #define MAJOR_VER 2 #define MINOR_VER 6 #define MAJOR_VER_STR "2" #define MINOR_VER_STR "6" #define MY_FILE "/home/user/.myapp" MAJOR_VER_STRING MINOR_VER_STRING

4
マクロ引数を文字列リテラルとして使用するにはどうすればよいですか?
変数名の文字列リテラル表現と変数自体の両方を関数に渡すマクロを作成する方法を理解しようとしています。 たとえば、次の関数が与えられます。 void do_something(string name, int val) { cout << name << ": " << val << endl; } これを実行できるように、マクロを作成したいと思います。 int my_val = 5; CALL_DO_SOMETHING(my_val); どちらが印刷されますか: my_val: 5 私は次のことを試みました: #define CALL_DO_SOMETHING(VAR) do_something("VAR", VAR); ただし、ご想像のとおり、引用符内のVARは置き換えられず、文字列リテラル「VAR」として渡されるだけです。したがって、マクロ引数を文字列リテラル自体に変換する方法があるかどうかを知りたいと思います。

19
列挙型の変数をCの文字列として使用する簡単な方法は?
これが私がやろうとしていることです: typedef enum { ONE, TWO, THREE } Numbers; 次のようなスイッチケースを実行する関数を記述しようとしています。 char num_str[10]; int process_numbers_str(Numbers num) { switch(num) { case ONE: case TWO: case THREE: { strcpy(num_str, num); //some way to get the symbolic constant name in here? } break; default: return 0; //no match return 1; } すべてのケースで定義する代わりに、上記のように列挙型変数を使用して設定する方法はありますか?

13
##プリプロセッサオペレーターと考慮すべき問題のアプリケーションは何ですか?
以前の質問の多くで述べたように、私はK&Rを通じて作業しており、現在プリプロセッサーに取り組んでいます。さらに興味深いことの1つは、これまでCを学ぼうとした試みのどれからもこれまで私が知らなかったものですが、##プリプロセッサーオペレーターです。K&Rによると: プリプロセッサー演算子## は、マクロ展開中に実際の引数を連結する方法を提供します。置換テキストのパラメーターがに隣接している##場合、パラメーターは実際の引数に置き換えられ、 ##および周囲の空白が削除され、結果が再スキャンされます。たとえば、マクロpaste は2つの引数を連結します。 #define paste(front, back) front ## back そのpaste(name, 1)トークンを作成します name1。 現実世界でこれをどのように、そしてなぜ使用するのでしょうか?その実際の使用例は何ですか?考慮すべき落とし穴はありますか?


2
正確には、二重文字列化のトリックはどのように機能しますか?
少なくとも一部のCプリプロセッサでは、マクロを文字列化する関数のようなマクロから別のマクロに渡すことで、マクロの名前ではなく値を文字列化できます。 #define STR1(x) #x #define STR2(x) STR1(x) #define THE_ANSWER 42 #define THE_ANSWER_STR STR2(THE_ANSWER) /* "42" */ ここでの使用例の例。 これは、少なくともGCCとClang(両方とも-std=c99)では機能しますが、C標準の用語でどのように機能するかはわかりません。 この動作はC99によって保証されていますか? もしそうなら、C99はどのようにそれを保証しますか? そうでない場合、動作はどの時点でC定義からGCC定義に移行しますか?


7
Linuxカーネルのcontainer_ofマクロを理解する
Linuxカーネルを閲覧しているときにcontainer_of、次のように定義されているマクロを見つけました。 #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) container_ofの機能は理解できますが、理解できないのは最後の文です。 (type *)( (char *)__mptr - offsetof(type,member) );}) 次のようにマクロを使用する場合: container_of(dev, struct wifi_device, dev); 最後の文の対応する部分は次のようになります。 (struct wifi_device *)( (char *)__mptr - offset(struct wifi_device, dev); 何もしていないように見えます。誰かがここの隙間を埋めてくれませんか?


6
#define内の#ifdef
私はこのようなものを書き込もうとしています: #define COV_ON(x) \ #ifdef COVERAGE_TOOL \ _Pragma (COVERAGE #x) #endif COV_ONこのように定義する方法はありますか?#ifdef#defineの内部に入れることができないので、上記で行ったことは間違っていることを知っています。(#で許可されている文字ではありません#define)。それで、解決策はありますか?
83 c  c-preprocessor 

6
#define vs const in Objective-C
私はObjective-Cconstを初めて使用しますが、前処理ディレクティブに関していくつか質問があり#defineます。 まず、を使用して定数の型を定義することはできないことがわかりました#define。何故ですか? 第二に、それらの1つを別のものよりも使用する利点はありますか? 最後に、どちらの方法がより効率的および/またはより安全ですか?

4
ifディレクティブマクロ比較
#if次のコードの条件が満たされるのはなぜですか。 #include <iostream> #define VALUE foo int main() { #if VALUE == bar std::cout << "WORKS!" << std::endl; #endif // VALUE }

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.