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

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

8
引数の数に関するマクロのオーバーロード
私は2つのマクロFOO2とFOO3: #define FOO2(x,y) ... #define FOO3(x,y,z) ... 新しいマクロFOOを次のように定義したい: #define FOO(x,y) FOO2(x,y) #define FOO(x,y,z) FOO3(x,y,z) ただし、マクロは引数の数をオーバーロードしないため、これは機能しません。 変更することなく、FOO2かつFOO3、マクロを定義するためにいくつかの方法がありますFOO(使用して__VA_ARGS__ディスパッチのと同じ効果を得るため、またはそれ以外)FOO(x,y)にFOO2、およびFOO(x,y,z)にはFOO3?
183 c  macros  c-preprocessor 

30
C ++マクロが役立つのはいつですか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 2年前休業。 この質問を改善する Cのプリプロセッサは、正当に恐れやC ++コミュニティで敬遠されます。インライン関数、consts、およびテンプレートは通常、の安全で優れた代替手段#defineです。 次のマクロ: #define SUCCEEDED(hr) ((HRESULT)(hr) >= 0) タイプセーフより優れているわけではありません。 inline bool succeeded(int hr) { return hr >= 0; } ただし、マクロにはその位置があります。プリプロセッサなしでは実行できないマクロの用途を挙げてください。 投票できるように、各ユースケースを別々の回答に入れてください。また、前任者なしで回答の1つを達成する方法を知っている場合は、その回答のコメントでその方法を指摘してください。



6
C ++での__FILE __、__ LINE__、および__FUNCTION__の使用法
彼らはあなたのC ++コンパイラのサポートしていることを仮定すると、特定の理由があるない使用する__FILE__、__LINE__および__FUNCTION__ロギングとデバッグ目的のためには? 私は主に、ユーザーに誤解を招くようなデータを与えること(例えば、最適化の結果として誤った行番号または機能を報告すること)、または結果としてパフォーマンスヒットをとることに関心があります。 基本的に、私は信頼できる__FILE__、__LINE__と__FUNCTION__するために、常に正しいことを行いますか?

2
Cプリプロセッサで2回連結し、「arg ## _ ## MACRO」のようにマクロを展開する方法は?
一部の関数の名前が特定のマクロ変数の値に依存しているプログラムを、次のようなマクロで記述しようとしています。 #define VARIABLE 3 #define NAME(fun) fun ## _ ## VARIABLE int NAME(some_function)(int a); 残念ながら、マクロNAME()はそれを int some_function_VARIABLE(int a); のではなく int some_function_3(int a); ですから、これは明らかに間違った方法です。幸い、VARIABLEの可能な値の数は少ないので、単純にを実行し#if VARIABLE == nてすべてのケースを個別にリストできますが、それを行うための巧妙な方法があるかどうか疑問に思いました。

10
GCCの## __ VA_ARGS__トリックの標準的な代替手段ですか?
C99の可変個引数マクロの空の引数に関するよく知られた 問題があります。 例: #define FOO(...) printf(__VA_ARGS__) #define BAR(fmt, ...) printf(fmt, __VA_ARGS__) FOO("this works fine"); BAR("this breaks!"); BAR()C99標準によれば、上記の使用は実際には正しくありません。 printf("this breaks!",); 末尾のコンマに注意してください-機能しません。 一部のコンパイラー(例:Visual Studio 2010)は、その末尾のコンマを静かに削除します。他のコンパイラ(例:GCC)##は__VA_ARGS__、の前に置くことをサポートしています。 #define BAR(fmt, ...) printf(fmt, ##__VA_ARGS__) しかし、この動作を実現するための標準準拠の方法はありますか?おそらく複数のマクロを使用していますか? 現在、##バージョンはかなりサポートされているようですが(少なくとも私のプラットフォームでは)、実際には標準に準拠したソリューションを使用します。 プリエンプティブ:小さな関数を書くことができることは知っています。マクロを使用してこれを実行しようとしています。 編集:BAR()を使用する理由の例(単純ですが)を次に示します。 #define BAR(fmt, ...) printf(fmt "\n", ##__VA_ARGS__) BAR("here is a log message"); BAR("here is a log message with a …

3
C / C ++プリプロセッサの1行に1つのポンド/ハッシュ記号(#)を付ける目的は何ですか?
私はBoostライブラリのソースコードを見ていましたが、プリプロセッサディレクティブが付加されていないシングルポンド記号がよくあることに気づきました。GCCプリプロセッサのマニュアルと仕様ガイドを読みましたが、何も見つかりません。 (1) #ifndef BOOST_CONFIG_HPP (2) # include <boost/config.hpp> (3) #endif (4) # (5) #if defined(BOOST_HAS_PRAGMA_ONCE) (6) # pragma once (7) #endif 4行目では、ポンド記号の後に何もありません。これはどのような影響がありますか?Cプリプロセッサ(CPP)仕様で定義されていますか? Boostはクロスプラットフォームライブラリであるため、CPPで正しく解析できると思います。コード全体にランダムなポンド記号/ハッシュ記号があると、どのような影響/副作用がありますか?
145 c++  c  boost  c-preprocessor 

17
Cプログラム内のテキストファイルをchar []として「#include」
コンパイル時にCプログラムにテキストファイル全体を文字列として含める方法はありますか? 何かのようなもの: file.txt: This is a little text file main.c: #include <stdio.h> int main(void) { #blackmagicinclude("file.txt", content) /* equiv: char[] content = "This is\na little\ntext file"; */ printf("%s", content); } stdoutに出力する小さなプログラム「これは小さなテキストファイルです」を取得しています 現時点ではハックなpythonスクリプトを使用しましたが、お尻が醜く、変数名は1つだけに制限されています。別の方法で教えてもらえますか?

15
#define、enum、またはconstを使用する必要がありますか?
私が取り組んでいるC ++プロジェクトでは、4つの値を持つことができるフラグの種類の値があります。これらの4つのフラグは組み合わせることができます。フラグはデータベースのレコードを表し、次のいずれかになります。 新記録 削除されたレコード 変更されたレコード 既存の記録 ここで、各レコードに対してこの属性を保持したいので、列挙型を使用できます。 enum { xNew, xDeleted, xModified, xExisting } ただし、コードの他の場所では、ユーザーに表示するレコードを選択する必要があるため、次のように、それを単一のパラメーターとして渡すことができます。 showRecords(xNew | xDeleted); だから、私は3つの可能なアプローチがあるようです: #define X_NEW 0x01 #define X_DELETED 0x02 #define X_MODIFIED 0x04 #define X_EXISTING 0x08 または typedef enum { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } RecordType; または namespace RecordType …



14
コンパイル時に#defineの値を表示するにはどうすればよいですか?
私のコードがどのバージョンのBoostを使用していると考えているかを調べようとしています。私はこのようなことをしたいです: #error BOOST_VERSION しかし、プリプロセッサはBOOST_VERSIONを展開しません。 プログラムから実行時に出力できることはわかっていますし、プリプロセッサの出力を見て答えを見つけることもできます。コンパイル中にこれを行う方法があると便利だと思います。

3
C / C ++マクロ文字列連結
#define STR1 "s" #define STR2 "1" #define STR3 STR1 ## STR2 STR3 == "s1"を連結することは可能ですか?これを行うには、argsを別のマクロ関数に渡します。しかし、直接的な方法はありますか?
121 c++  c  c-preprocessor 

4
プリプロセッサマクロからプラットフォーム/コンパイラを識別する方法
私はLinux、Windows、Mac OSでコンパイルできるクロスプラットフォームコードを書いています。Windowsでは、ビジュアルスタジオとmingwをサポートする必要があります。 プラットフォーム固有のコードがいくつかありますが、これを#ifdef .. #endif環境に配置する必要があります。たとえば、ここではwin32固有のコードを配置しました。 #ifdef WIN32 #include <windows.h> #endif しかし、どうすればLinuxとMac OSを認識できますか?使用すべき定義名(など)は何ですか?

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