0

このサンプルコードは、Cの関数ポインターはどのように機能するのですか?

#import <stdlib.h>
#define MAX_COLORS  256

typedef struct {
    char* name;
    int red;
    int green;
    int blue;
} Color;

Color Colors[MAX_COLORS];


void eachColor (void (*fp)(Color *c)) {
    int i;
    for (i=0; i<MAX_COLORS; i++)
        (*fp)(&Colors[i]);
}

void printColor(Color* c) {
    if (c->name)
        printf("%s = %i,%i,%i\n", c->name, c->red, c->green, c->blue);
}

int main() {
    Colors[0].name="red";
    Colors[0].red=255;
    Colors[1].name="blue";
    Colors[1].blue=255;
    Colors[2].name="black";

    eachColor(printColor);
}

コードは次のエラーを返します。

test.c: In function ‘printColor’:
test.c:21: warning: incompatible implicit declaration of built-in function ‘printf’
4

4 に答える 4

5

printfstdio.hではなく、 に住んでいstdlib.hます。

于 2012-07-24T15:45:11.760 に答える
3

他の人が言ったことに加えて、Cコンパイラがプロトタイプを見たことがない関数に出くわした場合、それは一般的に間違っているであろうその関数のシグニチャについての仮定をします。

stdio.hを含めると、関数のプロトタイプが含まれるため、コンパイラーはそのシグネチャを推測する必要がありません。

于 2012-07-24T15:48:40.410 に答える
2

stdio.h のインクルードを追加:

#include <stdio.h>
于 2012-07-24T15:45:19.063 に答える
1

stdio.hの代わりにstdlib.hを含めました。stdlib.hではなくprintfが定義されているstdio.hです。したがって、変更すると、警告が解決される場合があります。

于 2012-07-24T15:47:17.180 に答える