函数指针声明时的形参列表可以没有

在VC6.0环境中调试程序时遇到errorC2440错误,通过修改函数指针定义方式成功解决问题。具体操作包括:将PFpfun=add;修正为PFpfun=(void(__cdecl*)(int,int,...))add;,并实现了一个简单的add函数,用于演示如何正确定义和使用函数指针。

原文地址:http://www.cnblogs.com/mlj318/archive/2011/11/02/2233106.html

在VC 6.0 环境中调试程序出现错误

error C2440: 'initializing' : cannot convert from '' to 'void (__cdecl *)(int,int,...)'
        None of the functions with this name in scope match the target type
将PF pfun = add; 修正为 PF pfun = (void (__cdecl *)(int,int,...))add;

修正结果为下面代码中显示:

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

typedef void (* PF)(int,int,...);

void add(int a,int b,int *result)
{
   *result=a+b;
   printf("result:%d\n",*result);
}

void main()
{
	int x,y,z;

	PF pfun = (void (__cdecl *)(int,int,...))add;
	x=5;
	y=4;	
	pfun(x,y,&z);
}


<think>好的,我现在需要帮助用户理解如何在C/C++中使用函数指针作为函数参数。首先,我得回忆一下相关的知识点,确保自己理解正确。根据用户提供的引用资料,特别是引用[1]和引用[4],函数指针允许将函数作为参数传递,这提供了灵活性和动态性,比如实现回调机制。 首先,用户的问题是如何使用函数指针作为形参。我需要先解释函数指针声明方式,然后给出示例。根据引用[3],函数指针的类型由其返回值和参数列表决定。例如,一个返回int且有两个int参数的函数,其指针类型是int (*)(int, int)。在声明作为参数的函数指针,可以用类似的方式。 接下来,我需要展示具体的例子。例如,一个排序函数,可以接受比较函数作为参数,这样用户就能根据同的比较逻辑进行排序。这样能体现函数指针的实用性。引用[2]中的Calculator结构体例子也展示了如何将函数指针存储在结构体中,但用户更关注的是作为函数参数的情况,所以应该侧重这个方面。 还要注意常见的错误,比如引用[5]中的swap错误示例,虽然用户的问题是关于函数指针参数,但可能需要注意函数指针使用中的陷阱,比如未初始化指针或类型匹配。过当前问题可能需要深入讨论错误示例,除非用户提到。 然后,我需要分步骤解释如何声明函数指针参数。比如,在函数定义,如何将参数写成函数指针形式。例如,void sort(int *arr, int n, int (*compare)(int, int))。这里需要说明语法结构,可能用户对函数指针声明太熟悉,容易混淆。 此外,还要考虑C和C++中的同,比如C++中可能使用typedef或using来简化函数指针类型,或者使用模板实现更泛化的函数参数。引用[3]提到解决泛型编程中的多样化参数问题,所以可能需要提到C++中的模板和函数对象的结合使用,但用户的问题主要针对函数指针,所以可能需要深入模板部分。 最后,生成相关问题要围绕函数指针的应用、优势、注意事项以及更高级的用法,比如函数指针数组或成员函数指针,这些在引用[4]中有提到。但用户的问题集中在作为参数,所以相关问题可以包括回调机制、函数指针数组、与泛型编程的结合等。 总结步骤: 1. 解释函数指针作为参数的作用和优势。 2. 展示如何声明函数指针参数。 3. 提供具体示例,如排序函数中的比较函数。 4. 比较C和C++中的同写法(如typedef)。 5. 注意事项,如类型匹配。 6. 生成相关问题,引导深入学习。</think>### C/C++ 函数指针作为函数参数的用法及示例 #### 一、函数指针作为形参的核心作用 函数指针作为参数的核心价值在于**实现代码复用**和**增强灵活性**。通过将函数地址作为参数传递,可以让调用方动态决定具体执行逻辑,例如: - 排序算法中自定义比较规则 - 数学计算中动态选择运算方式 - 事件驱动编程中的回调机制[^1] #### 二、函数指针参数声明语法 ```c // C语言标准声明方式 返回值类型 函数名(参数列表, 返回值类型 (*指针名)(参数类型列表)) // C++兼容写法 返回值类型 函数名(参数列表, 返回值类型 (*指针名)(参数类型列表)) ``` #### 三、典型应用示例 **示例1:数学运算器(C语言实现)** ```c #include <stdio.h> // 定义函数指针类型 typedef int (*MathFunc)(int, int); int add(int a, int b) { return a + b; } int subtract(int a, int b) { return a - b; } void calculator(int x, int y, MathFunc operation) { printf("结果:%d\n", operation(x, y)); } int main() { calculator(10, 5, add); // 输出 15 calculator(10, 5, subtract); // 输出 5 return 0; } ``` **示例2:通用排序算法(C++实现)** ```cpp #include <iostream> using namespace std; // 比较函数原型 typedef bool (*CompareFunc)(int, int); void bubbleSort(int arr[], int n, CompareFunc comp) { for(int i=0; i<n-1; ++i) { for(int j=0; j<n-i-1; ++j) { if(comp(arr[j], arr[j+1])) { swap(arr[j], arr[j+1]); } } } } // 升序比较函数 bool ascending(int a, int b) { return a > b; } // 降序比较函数 bool descending(int a, int b) { return a < b; } int main() { int arr[] = {5,2,8,1,6}; int n = sizeof(arr)/sizeof(arr[0]); bubbleSort(arr, n, ascending); // 升序排序 // bubbleSort(arr, n, descending); // 降序排序 } ``` #### 四、注意事项 1. **类型严格匹配**:函数
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值