1

我最近正在阅读 Linux 内核。我发现在很多情况下他们使用结构“typedef xxx f(xxx)”,但我不明白它是如何工作的。(类似函数指针的东西?)

这是我的测试代码。

#include<stdio.h>
typedef int Myfunc(int);
typedef int (*point_to_myfunc)(int);
static Myfunc example;
static int example(int a){
    printf("example a=%d\n", a);
    return 1;
}
static void example2(Myfunc* f){
    printf("example2\n");
    f(2);
}
static void example3(int (*)(int));
static void example3(int (*point_to_Myfunc)(int)){
    printf("example3\n");
    point_to_Myfunc(3);
}
int main(){
    point_to_myfunc f=&example;
    example2(f);
    example3(f);
    return 0;
}

谁能给我一个简短的解释?谢谢~

4

4 回答 4

3
#include <stdio.h>
typedef int Myfunc(int);

Myfunc是类型的名称;它是一个接受int参数并返回int.

typedef int (*point_to_myfunc)(int);

point_to_myfunc是一个指向函数的指针,它接受一个int参数并返回一个int. 您还可以:typedef Myfunc *ptr_to_myfunc;如果您愿意(同一类型的另一个名称)。

static Myfunc example;

这表示'存在一个名为'example类型的函数Myfunc'。

static int example(int a)
{
    printf("example a=%d\n", a);
    return 1;
}

这是一个可能的实现example。您不能使用 typedef 名称来喜欢Myfunc该类型函数的定义。

static void example2(Myfunc *f)
{
    printf("example2\n");
    f(2);
}

这是一个接受指向 a 的指针的函数Myfunc。该行f(2);调用参数 2 指向的函数并忽略返回值。

static void example3(int (*)(int));

这声明example3为一个函数,该函数接受一个指向一个函数的指针,该函数接受一个int参数并返回一个int结果。它可以写成static void example3(point_to_myfunc);or static void example3(ptr_to_myfunc);or static void example3(Myfunc *);

static void example3(int (*point_to_Myfunc)(int))
{
    printf("example3\n");
    point_to_Myfunc(3);
}

这是example3.

int main(void)
{
    point_to_myfunc f = &example;
    example2(f);
    example3(f);
    return 0;
}

这个程序有一个变量f,它是一个函数的指针。有趣的是,您可以:

    point_to_myfunc f2 = example;
    point_to_myfunc f3 = *example;

等等。它们的意思都是一样的。

您还可以使用以下方法调用它们:

    (*f2)(101);
    (**f3)(103);

初始化的标准符号既不使用&也不使用*。如果你是一个老派的 C 程序员,你可以使用(*f2)(101)符号来调用函数指针;在 C89 标准之前,这是调用函数指针的唯一方法。现代风格往往是f2(101);相反的。

于 2013-03-22T06:16:12.123 回答
1
typedef int Myfunc(int);

这意味着 Myfunc 是一个函数类型,它接受一个 int 参数并返回一个 int。

这一行:

static Myfunc example;

和说的一样

static int example(int);

前向声明示例函数。

这样做的一个用途是更清楚地说明一组特定的功能用于特定目的。

typedef char CharacterConverter(char);

extern CharacterConverter make_upper_case;
extern CharacterConverter make_lower_case;

extern void process_string(char *s,CharacterConverter *f);
    // easier to see that make_upper_case and make_lower_case are valid arguments.
于 2013-03-22T05:49:33.183 回答
1

Vaughn Cato 是正确的,此外,

typedef int (*point_to_myfunc)(int);

定义了一个函数指针,表示point_to_myfunc是一个类型,我们可以这样使用它:

point_to_myfunc f=&example;

现在 f 就像 example() 一样,我们可以 f() 来调用方法 example

于 2013-03-22T06:01:54.740 回答
0

typedef 在定义类型时很有用。

例如: char *a, b;定义了一个指针“a”和一个char b。 char *a, *b定义了两个 char 指针。如果使用 typedef,就很清楚了:

typedef char* PCHAR;
PCHAR a,b;

现在,a 和 b 都是 char 指针。

typedef int Myfunc(int);
typedef int (*point_to_myfunc)(int);

这两行定义了一对,一个函数格式和一个可以指向函数的指针类型,所以在使用时会更清楚更明显。

于 2013-03-22T05:53:56.003 回答