3

マクロ名と置換リストが同じ前処理ディレクティブをいくつか見つけました。たとえば、gcc によって提供される stdbool.h 内のいくつかの前処理ディレクティブ。

#else /* __cplusplus */

/* Supporting <stdbool.h> in C++ is a GCC extension.  */
#define _Bool   bool
#define bool    bool
#define false   false
#define true    true

#endif /* __cplusplus */

プログラマーがこれらの前処理ディレクティブを作成した理由がわかりません。それらは役に立たず、交換は時間を無駄にします。これが無限再帰を引き起こさないことを私は知っています。無限再帰を回避するには? C標準の関連条項は何ですか?

4

4 に答える 4

1

時々、標準は「Xマクロでなければならない」と言っています。あなたの言語がすでに本質的なものを持っているなら、あなたは標準に準拠しているXと言わなければなりません。#define X X(たとえば、ユーザーはこれが真実であると言っ#ifdef Xて期待することができます。)

例(C11、7.2 / 2):

マクロは、実際のassert関数としてではなく、マクロとして実装する必要があります。実際の関数にアクセスするためにマクロ定義が抑制されている場合、動作は未定義です。

あなたの実装が実際のassert機能を持っていることは完全にもっともらしいです。

おもしろいことに、マクロなのか外部リンケージのある識別子なのかについて「特定されていない」ものがいくつかあります。

  • errno

  • setjmp

  • va_copyva_end

  • putcgetc

于 2012-09-04T12:29:59.993 に答える
1

マクロ展開は再帰しないため、終了します。

マクロを使用する利点の 1 つは、プリプロセッサでテストできることです。

#if defined bool
...
#endif

boolがマクロの場合にのみ機能します。

于 2012-09-04T12:30:57.250 に答える