贝壳头 发表于 2022-2-27 16:29:42

typedef 函数指针和指针函数

typedef int *(*PTR_TO_FUN)(int);

请问这是定义的函数指针还是 指针函数?参数和返回值都是?

傻眼貓咪 发表于 2022-2-27 17:05:24

#include <stdio.h>

void A(int x)
{
    // 这是函数,参数是整数
    printf("这是函数 A,x值: %d\n", x);
}

void B(int y)
{
    // 这是函数,参数是整数
    printf("这是函数 B,y值: %d\n", y);
}

void* p = A; // 指针 p 指向函数 A
void* q = B; // 指针 q 指向函数 B

typedef int* (*PTR_TO_FUN)(int); // 将指针重新取名,函数需符合一个整数参数

int main()
{
    PTR_TO_FUN Myfunc_A = p; // 赋值(值是指向函数 A 的指针)
    PTR_TO_FUN Myfunc_B = q; // 赋值(值是指向函数 B 的指针)

    if (*Myfunc_A(216)); // 调用函数 A
    if (*Myfunc_B(20)); // 调用函数 B
    return 0;
}这是函数 A,x值: 216
这是函数 B,y值: 20

jhq999 发表于 2022-2-27 17:33:10

本帖最后由 jhq999 于 2022-2-27 17:34 编辑

傻眼貓咪 发表于 2022-2-27 17:05



    PTR_TO_FUN Myfunc_A = (PTR_TO_FUN)p; // 赋值(值是指向函数 A 的指针)
    PTR_TO_FUN Myfunc_B = (PTR_TO_FUN)q; // 赋值(值是指向函数 B 的指针)
不进行强制转换vs编译器通不过

傻眼貓咪 发表于 2022-2-27 17:42:11

jhq999 发表于 2022-2-27 17:33
不进行强制转换vs编译器通不过

可能是编译器的不同,报错机能问题吧。

我用
VS Studio 2019 没有问题,
gdb online 没有问题,
DEV C++ 没有问题。

傻眼貓咪 发表于 2022-2-27 17:52:36

jhq999 发表于 2022-2-27 17:33
不进行强制转换vs编译器通不过

其实我也想尝试新的编译器(最好是那种超级敏感,报错机能最好的)学习学习(增进代码知识)。
因为我发现我目前用的编译器对于太深或太复杂的代码,报错好象不是很理想,只报错一点点。{:5_99:}

jhq999 发表于 2022-2-27 19:19:01

傻眼貓咪 发表于 2022-2-27 17:52
其实我也想尝试新的编译器(最好是那种超级敏感,报错机能最好的)学习学习(增进代码知识)。
因为我发 ...

可能我用的版本太老吧

傻眼貓咪 发表于 2022-2-27 19:29:43

jhq999 发表于 2022-2-27 19:19
可能我用的版本太老吧

{:5_92:}

人造人 发表于 2022-2-27 20:19:00

jhq999 发表于 2022-2-27 19:19
可能我用的版本太老吧

你的文件后缀是 .cpp 吧?

jhq999 发表于 2022-2-27 20:42:33

人造人 发表于 2022-2-27 20:19
你的文件后缀是 .cpp 吧?

Visual Studio2012

人造人 发表于 2022-2-27 20:45:29

jhq999 发表于 2022-2-27 20:42
Visual Studio2012

源代码文件的后缀
main.cpp or main.c

jhq999 发表于 2022-2-27 20:48:30

人造人 发表于 2022-2-27 20:45
源代码文件的后缀
main.cpp or main.c

原来是没有把预编译头关了

人造人 发表于 2022-2-27 21:20:26

jhq999 发表于 2022-2-27 20:48
原来是没有把预编译头关了

那也不应该报错吧?

人造人 发表于 2022-2-27 21:24:14

jhq999 发表于 2022-2-27 20:48
原来是没有把预编译头关了

$ cat main.c
#include <stdio.h>

void A(int x)
{
    // 这是函数,参数是整数
    printf("这是函数 A,x值: %d\n", x);
}

void B(int y)
{
    // 这是函数,参数是整数
    printf("这是函数 B,y值: %d\n", y);
}

void* p = A; // 指针 p 指向函数 A
void* q = B; // 指针 q 指向函数 B

typedef int* (*PTR_TO_FUN)(int); // 将指针重新取名,函数需符合一个整数参数

int main()
{
    PTR_TO_FUN Myfunc_A = p; // 赋值(值是指向函数 A 的指针)
    PTR_TO_FUN Myfunc_B = q; // 赋值(值是指向函数 B 的指针)

    if (*Myfunc_A(216)); // 调用函数 A
    if (*Myfunc_B(20)); // 调用函数 B
    return 0;
}
$ gcc -g -Wall -o main main.c
$ mv main.c main.cpp
$ g++ -g -Wall -o main main.cpp
main.cpp:15:11: error: invalid conversion from ‘void (*)(int)’ to ‘void*’ [-fpermissive]
   15 | void* p = A; // 指针 p 指向函数 A
      |         ^
      |         |
      |         void (*)(int)
main.cpp:16:11: error: invalid conversion from ‘void (*)(int)’ to ‘void*’ [-fpermissive]
   16 | void* q = B; // 指针 q 指向函数 B
      |         ^
      |         |
      |         void (*)(int)
main.cpp: In function ‘int main()’:
main.cpp:22:27: error: invalid conversion from ‘void*’ to ‘PTR_TO_FUN’ {aka ‘int* (*)(int)’} [-fpermissive]
   22 |   PTR_TO_FUN Myfunc_A = p; // 赋值(值是指向函数 A 的指针)
      |                           ^
      |                           |
      |                           void*
main.cpp:23:27: error: invalid conversion from ‘void*’ to ‘PTR_TO_FUN’ {aka ‘int* (*)(int)’} [-fpermissive]
   23 |   PTR_TO_FUN Myfunc_B = q; // 赋值(值是指向函数 B 的指针)
      |                           ^
      |                           |
      |                           void*
$

jhq999 发表于 2022-2-27 21:24:27

人造人 发表于 2022-2-27 21:20
那也不应该报错吧?

>Test.c : fatal error C1853: “Release\ConsoleTest.pch”预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)

人造人 发表于 2022-2-27 21:26:01

jhq999 发表于 2022-2-27 21:24
>Test.c : fatal error C1853: “Release\ConsoleTest.pch”预编译头文件来自编译器的早期版本,或者预编 ...

嗯,没见过这个错误
页: [1]
查看完整版本: typedef 函数指针和指针函数