鱼C论坛

 找回密码
 立即注册
查看: 1385|回复: 14

[已解决]typedef 函数指针和指针函数

[复制链接]
发表于 2022-2-27 16:29:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
typedef int *(*PTR_TO_FUN)(int);

请问这是定义的函数指针还是 指针函数?参数和返回值都是?
最佳答案
2022-2-27 17:05:24
  1. #include <stdio.h>

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

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

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

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

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

  19.     if (*Myfunc_A(216)); // 调用函数 A
  20.     if (*Myfunc_B(20)); // 调用函数 B
  21.     return 0;
  22. }
复制代码
  1. 这是函数 A,x值: 216
  2. 这是函数 B,y值: 20
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-2-27 17:05:24 | 显示全部楼层    本楼为最佳答案   
  1. #include <stdio.h>

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

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

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

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

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

  19.     if (*Myfunc_A(216)); // 调用函数 A
  20.     if (*Myfunc_B(20)); // 调用函数 B
  21.     return 0;
  22. }
复制代码
  1. 这是函数 A,x值: 216
  2. 这是函数 B,y值: 20
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-27 17:33:10 | 显示全部楼层
本帖最后由 jhq999 于 2022-2-27 17:34 编辑

  1.   
  2.     PTR_TO_FUN Myfunc_A = (PTR_TO_FUN)p; // 赋值(值是指向函数 A 的指针)
  3.     PTR_TO_FUN Myfunc_B = (PTR_TO_FUN)q; // 赋值(值是指向函数 B 的指针)
复制代码

不进行强制转换vs编译器通不过
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-27 17:42:11 | 显示全部楼层
jhq999 发表于 2022-2-27 17:33
不进行强制转换vs编译器通不过

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

我用
VS Studio 2019 没有问题,
gdb online 没有问题,
DEV C++ 没有问题。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-27 17:52:36 | 显示全部楼层
jhq999 发表于 2022-2-27 17:33
不进行强制转换vs编译器通不过

其实我也想尝试新的编译器(最好是那种超级敏感,报错机能最好的)学习学习(增进代码知识)。
因为我发现我目前用的编译器对于太深或太复杂的代码,报错好象不是很理想,只报错一点点。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

可能我用的版本太老吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-27 19:29:43 | 显示全部楼层
jhq999 发表于 2022-2-27 19:19
可能我用的版本太老吧

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-27 20:19:00 | 显示全部楼层
jhq999 发表于 2022-2-27 19:19
可能我用的版本太老吧

你的文件后缀是 .cpp 吧?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-27 20:42:33 | 显示全部楼层
人造人 发表于 2022-2-27 20:19
你的文件后缀是 .cpp 吧?

Visual Studio2012
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-27 20:45:29 | 显示全部楼层

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

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-27 20:48:30 | 显示全部楼层
人造人 发表于 2022-2-27 20:45
源代码文件的后缀
main.cpp or main.c

原来是没有把预编译头关了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-27 21:20:26 | 显示全部楼层
jhq999 发表于 2022-2-27 20:48
原来是没有把预编译头关了

那也不应该报错吧?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-27 21:24:14 | 显示全部楼层
jhq999 发表于 2022-2-27 20:48
原来是没有把预编译头关了
  1. $ cat main.c
  2. #include <stdio.h>

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

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

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

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

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

  20.     if (*Myfunc_A(216)); // 调用函数 A
  21.     if (*Myfunc_B(20)); // 调用函数 B
  22.     return 0;
  23. }
  24. $ gcc -g -Wall -o main main.c
  25. $ mv main.c main.cpp
  26. $ g++ -g -Wall -o main main.cpp
  27. main.cpp:15:11: error: invalid conversion from ‘void (*)(int)’ to ‘void*’ [-fpermissive]
  28.    15 | void* p = A; // 指针 p 指向函数 A
  29.       |           ^
  30.       |           |
  31.       |           void (*)(int)
  32. main.cpp:16:11: error: invalid conversion from ‘void (*)(int)’ to ‘void*’ [-fpermissive]
  33.    16 | void* q = B; // 指针 q 指向函数 B
  34.       |           ^
  35.       |           |
  36.       |           void (*)(int)
  37. main.cpp: In function ‘int main()’:
  38. main.cpp:22:27: error: invalid conversion from ‘void*’ to ‘PTR_TO_FUN’ {aka ‘int* (*)(int)’} [-fpermissive]
  39.    22 |     PTR_TO_FUN Myfunc_A = p; // 赋值(值是指向函数 A 的指针)
  40.       |                           ^
  41.       |                           |
  42.       |                           void*
  43. main.cpp:23:27: error: invalid conversion from ‘void*’ to ‘PTR_TO_FUN’ {aka ‘int* (*)(int)’} [-fpermissive]
  44.    23 |     PTR_TO_FUN Myfunc_B = q; // 赋值(值是指向函数 B 的指针)
  45.       |                           ^
  46.       |                           |
  47.       |                           void*
  48. $
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-27 21:24:27 | 显示全部楼层
人造人 发表于 2022-2-27 21:20
那也不应该报错吧?

>Test.c : fatal error C1853: “Release\ConsoleTest.pch”预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

嗯,没见过这个错误
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-24 18:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表