putcharへのポインタやマクロとして実装できる他の標準関数を渡すことに何か問題があるかどうかは疑問でした。関数ポインタを受け付ける関数。以下は、私がやっていることの例です。int(*)(int)を受け取る関数にputcharへのポインタを渡す
#include <stdio.h>
static int print(const char *s, int (*printc)(int))
{
int c;
while (*s != '\0') {
if ((c = printc(*s++)) < 0)
return c;
}
return printc('\n');
}
int main(void)
{
print("Hello, world", putchar);
return 0;
}
GCCとClangをGNU/Linuxで、GCCをOpenBSDでコンパイルする際に問題はありません。 putcharはマクロとして実装できるので、他のすべての標準準拠の実装で同じ動作をするかどうかは疑問です。私は、標準、特に関数ポインタとputcharのセクションを検索し、これが合法であるかどうかを指定するものは何も見つかりませんでした。
ありがとうございました。
"関数"が実際にマクロである場合、コードはコンパイルされません。 –
これが標準に準拠しているかどうかは分かりませんが、 'gcc'でこれが期待される動作であるように見えます:http://gcc.gnu.org/onlinedocs/cpp/Function_002dlike-Macros.html – RageD
マクロ*のみを作成します。 –