機能
Plauger のThe Standard C Library<stdio.h>
(1992) を読むと、ヘッダーが を関数のようなマクロとして提供できるgetchar()
ことがわかります (そのファイル ポインター引数を複数回評価するgetc()
ための特別な権限があります!)。getc()
ただし、マクロを提供する場合でも、実装は、主にgetchar()
orgetc()
と呼ばれる関数ポインターにアクセスして、それを他の関数に渡すことができるように、同じジョブを実行する実際の関数を提供する義務があります。
つまり、次のようにします。
#include <stdio.h>
#undef getchar
extern int some_function(int (*)(void));
int core_function(void)
{
int c = some_function(getchar);
return(c);
}
書かれているように、core_function()
はかなり無意味ですが、要点を示しています。たとえば、isxxxx()
マクロでも同じことができます。<ctype.h>
通常、それはしたくありません。通常、マクロ定義を削除したくはありません。ただし、実際の機能が必要な場合は、それを手に入れることができます。ライブラリを提供する人は、標準 C ライブラリの機能を効果的にエミュレートできます。
めったに必要ない
また、明示的に使用する必要がほとんどない理由の 1 つは、次のよう#undef
に記述してマクロの代わりに関数を呼び出すことができるためです。
int c = (getchar)();
後のトークンは でgetchar
はないため(
、関数のようなマクロの呼び出しではないため、関数への参照である必要があります。同様に、上記の最初の例は、#undef
.
マクロ オーバーライドを使用して独自の関数を実装する場合は、これを使用して良い効果を得ることができますが、説明しないと少し混乱する可能性があります。
/* function.h */
…
extern int function(int c);
extern int other_function(int c, FILE *fp);
#define function(c) other_function(c, stdout);
…
/* function.c */
…
/* Provide function despite macro override */
int (function)(int c)
{
return function(c, stdout);
}
の後のトークンfunction
が not であるため、関数定義行はマクロを呼び出しません(
。return
行はマクロを呼び出します。