問題タブ [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.
c - How to make a char string from a C macro's value?
For example, how to avoid writing the 'func_name' twice?
I'd like to follow the Single Point of Truth rule.
Version of C preprocessor:
c - _never_executed() の目的は?
このマクロが以前に定義されているのを見たことがありますが、その目的を本当に知りませんでした。誰でもこれに光を当てることができますか?
c - #undef-ing in Practice?
Cでの#undefの実用化について疑問に思っています。私はK&Rを使用して作業しており、プリプロセッサを使用しています。これのほとんどは私が(多かれ少なかれ)理解した資料でしたが、90ページ(第2版)の何かが私に突き出ていました:
名前は
#undef
、通常、ルーチンがマクロではなく実際に関数であることを確認するために、で定義されていない場合があります。
#undef getchar
int getchar(void) { ... }
#define
これは、関数と同じ名前のマクロを誰かから守るための一般的な方法ですか?それとも、これは実際には発生しないサンプルのようなものですか?(例えば、彼の正しい、間違った、または狂気の人は書き直すgetchar()
べきではないので、それは思い浮かばないはずです。)あなた自身の関数名で、これを行う必要性を感じますか?他の人が使用できるライブラリを開発している場合、それは変わりますか?
c - ##プリプロセッサ演算子のアプリケーションと考慮すべき落とし穴は何ですか?
以前の質問の多くで述べたように、私はK&Rを介して作業しており、現在プリプロセッサを使用しています。より興味深いことの1つ、つまりCを学習しようとした以前の試みからは知らなかったことは、##
プリプロセッサ演算子です。K&Rによると:
プリプロセッサ演算子
##
は、マクロ展開中に実際の引数を連結する方法を提供します。置換テキストのパラメーターがに隣接している##
場合、パラメーターは実際の引数に置き換えられ、##
周囲の空白が削除され、結果が再スキャンされます。たとえば、マクロはpaste
その2つの引数を連結します。
#define paste(front, back) front ## back
したがって
paste(name, 1)
、トークンを作成しますname1
。
誰かがこれを現実の世界でどのようにそしてなぜ使うのでしょうか?その使用の実際的な例は何ですか、そして考慮すべき落とし穴はありますか?
c - Fortran 配列から C 配列へ。愚かなマクロトリックが必要
私はこの「簡略化された」fortranコードを持っています
プログラミングの第一人者の 1 人は、fortran は効率的に列の順序でデータにアクセスするのに対し、c は行の順序で効率的にデータにアクセスすると警告しました。彼は、コードをよく見て、古いプログラムの速度を維持するためにループを切り替える準備をすることを提案しました。
私は怠惰なプログラマーであり、日々の努力と犯しがちな間違いを認識しているため、このコードを安全かつ簡単に変換できる #define 手法があるのではないかと考え始めました。
何か提案はありますか?
c - ある C ソース ファイルを別の C ソース ファイルに含めますか?
別#include
のファイル内のファイルを使用しても問題ありませんか(または、推奨/グッド プラクティスでさえありますか) ?.c
.c
c - Convert a preprocessor token to a string
I'm looking for a way to convert a preprocessor token to a string.
Specifically, I've somewhere got:
and I want to use it to prevent buffer overrun:
I'm open to other ways to accomplish the same thing, but standard library only.
c++ - 同じ C/C++ アプリケーションのバリアントをビルドする最良の方法は何ですか?
同じソース コードから構築された 3 つの密接に関連するアプリケーションがあります。たとえば、APP_A、APP_B、および APP_C とします。APP_C は、APP_A のスーパーセットである APP_B のスーパーセットです。
これまでのところ、ビルドするアプリケーションを指定するためにプリプロセッサの定義を使用してきました。これは次のように機能します。
私のIDEビルドオプションは、次に指定します(たとえば)
...そしてソースコードには、次のようなものがあります
しかし、私は今朝自分の足を撃ち、1 つのファイルから #include "app_defines.h" の行を省略しただけで、非常に多くの時間を無駄にしました。すべてが正常にコンパイルされましたが、アプリケーションは起動時に AV でクラッシュしました。
これを処理するためのより良い方法が何であるかを知りたいです。以前は、これは通常、#define を (C++ で) 使用できると考える数少ないケースの 1 つでしたが、それでもひどく間抜けで、コンパイラは私を保護しませんでした。
c - C (またはおそらく C++) での X-Macros の使用パターンを文書化した優れたリファレンスは何ですか?
「 X-Macros 」の基本的な定義と例、およびいくつかのリファレンスは、C プリプロセッサに関するこのウィキペディアのエントリに記載されています。
X-Macro は、同様のマクロ呼び出し (「コンポーネント マクロ」と呼ぶことができる) のリストを含むヘッダー ファイル (通常、従来の ".h" の代わりに ".def" 拡張子を使用) です。
この強力な手法の使用方法に関する優れた情報源は何ですか? この方法を使用している有名なオープン ソース ライブラリはありますか?
c++ - #includeディレクティブを含むマクロ定義
#include
本体にディレクティブを含むマクロを定義する方法はありますか?
「」を入れるだけ#include
でエラーになります
ここでは、#
文字列を連結するために使用していません。
「」を使用すると\# include
、次の2つのエラーが発生します。
何か助けはありますか?