58

いくつかのC++コードをCに変換しようとしていますが、いくつかの問題に直面しています。構造内で関数を定義するにはどうすればよいですか?

このような:

 typedef struct  {
    double x, y, z;
    struct Point *next;
    struct Point *prev;
    void act() {sth. to do here};
} Point;
4

6 に答える 6

87

structいいえ、 Cの a 内で関数を定義することはできません。

ただし、関数ポインターを持つことはできますが、関数ポインターをstruct持つことは、C++ のメンバー関数とは大きく異なります。つまりthis、包含structインスタンスへの暗黙的なポインターはありません。

不自然な例 (オンライン デモhttp://ideone.com/kyHlQ ):

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct point
{
    int x;
    int y;
    void (*print)(const struct point*);
};

void print_x(const struct point* p)
{
    printf("x=%d\n", p->x);
}

void print_y(const struct point* p)
{
    printf("y=%d\n", p->y);
}

int main(void)
{
    struct point p1 = { 2, 4, print_x };
    struct point p2 = { 7, 1, print_y };

    p1.print(&p1);
    p2.print(&p2);

    return 0;
}
于 2012-09-28T15:22:59.983 に答える
20

ただし、構造体に関数ポインターを含めることはできます。しかし、この方法ではありません

このように定義できます

例:

typedef struct cont_func 
{
    int var1;
    int (*func)(int x, int y);
    void *input;
} cont_func;


int max (int x, int y)
{
    return (x > y) ? x : y;
}

int main () {
   struct cont_func T;

   T.func = max;
}
于 2012-09-28T15:29:45.743 に答える
10

C内でメソッドを定義することは許可されていませんstruct。構造体内で関数ポインタを次のように定義できます。

typedef struct  {
  double x, y, z;
  struct Point *next;
  struct Point *prev;
  void (*act)();
} Point;

をインスタンス化するときはいつでも、特定の関数にポインタを割り当てる必要がありますstruct

于 2012-09-28T15:24:14.647 に答える
8

いいえ、C では構造体内で関数を宣言することはできません。

これが、C と C++ の根本的な違い (の 1 つ) です。

このスレッドを参照してください: https://web.archive.org/web/20121024233849/http://forums.devshed.com/c-programming-42/declaring-function-in-structure-in-c-545529.html

于 2012-09-28T15:23:39.920 に答える
3

アイデアは、構造体内の関数へのポインターを置くことです。次に、関数は構造体の外部で宣言されます。これは、関数がクラス内で宣言されるC++のクラスとは異なります。

例:ここからコードを盗む:https ://web.archive.org/web/20121024233849/http://forums.devshed.com/c-programming-42/declaring-function-in-structure-in-c- 545529.html

struct t {
    int a;
    void (*fun) (int * a);
} ;

void get_a (int * a) {
    printf (" input : ");
    scanf ("%d", a);
}

int main () {
    struct t test;
    test.a = 0;

    printf ("a (before): %d\n", test.a);
    test.fun = get_a;
    test.fun(&test.a);
    printf ("a (after ): %d\n", test.a);

    return 0;
}

ここで test.fun = get_a;、関数を構造体のポインターに割り当て、それをtest.fun(&test.a);呼び出します。

于 2012-09-28T15:25:27.450 に答える
1

C プログラミング言語では、C++ とは異なり、構造体でのみ関数ポインターを定義できます。

于 2012-09-28T15:27:28.483 に答える