1

C言語で次のように定義する方法があるかどうか疑問に思いました#define

#define something #define
something a 42
something b 42
4

4 に答える 4

5

いいえ、Cではできません。別のマクロでマクロを定義することはできません。

C標準から:

6.10.3.4再スキャンとさらなる交換

3結果として得られる完全にマクロ置換された前処理トークンシーケンスは、前処理ディレクティブに似ていても処理されませんが、その中のすべてのプラグマ単項演算子式は、以下の6.10.9で指定されているように処理されます。

于 2012-09-16T15:03:31.103 に答える
2

いいえ、ありません。マクロの展開によってプリプロセッサディレクティブのように見えるものが生成された場合、それは1つとして処理されず、#適切なコンパイラによって認識されるソースコードにが残り#、予期しないトークンであることに異議を唱えます(構文エラー) 。

ISO / IEC 9899:2011

6.10.3.4再スキャンとさらなる交換

¶3結果として完全にマクロ置換された前処理トークンシーケンスは、たとえそれが類似していても前処理ディレクティブとして処理されませんが、その中のすべてのプラグマ単項演算子式は、以下の6.10.9で指定されているように処理されます。

参照される「プラグマ単項演算子」_Pragma()は、文字列リテラルを受け取る演算子です。

C99の表現は非常に似ており、C89の表現も似てい_Pragmaますが、C89には存在しなかったため、演算子については言及していません。


C2011標準のドラフトは、OpenStandardWebサイトで見つけることができます。

ワーキングペーパー、委員会会議の「郵送」などとともに。

(JTC1は合同技術委員会1、SC22はプログラミング言語の標準化委員会22、WG14はC標準を担当するワーキンググループ14、 WG21はC ++標準を担当します。)

標準のPDFの独自のパーソナライズされたコピーをANSIから30米ドルで入手できます。私はそれを真面目なCプログラマーにとって必要な投資だと考えています。

于 2012-09-16T15:03:44.037 に答える
1

いいえ。プリプロセッサは1回のパスしか実行しないため、最終的に、コンパイラに送られるコードには、構文エラーである#defineが含まれます。

于 2012-09-16T15:04:51.787 に答える
0

他の定義に基づいて何かを定義したい場合は、Cが#ifdefそれを実現するために提供します

お気に入り:-

#define something
#ifdef something
#define a 42
#else
#define b 42
#endif
于 2012-09-16T15:07:46.293 に答える