xcode6 使用MJRefresh,Too many arguments to function call, expected 0, have *

本文介绍了解决XCode6升级后出现的objc_msgSend调用参数错误的问题。通过调整项目的BuildSettings设置,将ENABLE_STRICT_OBJC_MSGSEND选项设为NO,可以避免编译错误。

转载自:  http://blog.youkuaiyun.com/wsjshx/article/details/40743291

将XCode升级到6后,报Too many arguments to function call, expected 0, have *,在XCode5.1里能编译通过的,到xcode6就报错

objc_msgSend(self.beginRefreshingTaget, self.beginRefreshingAction, self);

Too many arguments to function call, expected 0, have *

问了下度娘,

选中项目 - Project - Build Settings - ENABLE_STRICT_OBJC_MSGSEND 将其设置为 NO 即可


<think>好的,我现在需要帮助用户解决C++中的编译错误:“too many arguments to function call, expected 0, have 1”。用户还提供了几个站内的引用,我需要结合这些引用和之前的知识来给出解决方案。 首先,用户的问题是关于函数调用时参数数量不匹配的错误。常见的可能原因包括函数声明与定义不一致、函数重载问题、作用域或命名空间冲突、宏定义干扰,以及编译器设置或版本差异。我需要逐一分析这些可能性。 根据引用[1],用户遇到了close函数的参数错误,提示需要0个参数但传了1个。这可能是因为在C++中,标准库的close函数可能需要使用::close来明确调用全局作用域的函数,避免与类成员函数或其他作用域的同名函数冲突。例如,如果用户所在的类有一个名为close的成员函数,而没有参数,那么调用close(video_fd)会被解析为该成员函数,导致参数不匹配。这时候需要使用::close(video_fd)来调用C库的close函数。 引用[2]提到了Xcode中解决类似问题的方法,即调整ENABLE_STRICT_OBJC_MSGSEND设置为NO。虽然这是Objective-C的配置,但可能用户的项目中混用了C++和Objective-C代码,或者有类似的编译器严格检查设置。需要检查项目的编译器设置,是否有严格的参数检查导致的问题。 引用[3]和[4]提到的是其他类型的错误,比如虚函数重写不一致和宏参数问题,可能与当前问题关联不大,但可以作为参考。例如,检查是否有宏定义干扰了函数调用,导致参数数量被改变。 接下来,我需要结合用户之前的提问历史。用户之前询问了关于strlen传递引用的问题,现在转向编译错误,可能是在同一项目中遇到了多个问题,需要综合解决。 可能的解决方案步骤包括: 1. 检查函数声明和定义是否一致,特别是参数数量。 2. 确认是否误用了函数重载,或者存在作用域内的同名函数。 3. 使用显式的作用域解析符(如::close)调用正确的函数。 4. 检查项目中的宏定义,是否有影响函数调用的宏。 5. 调整编译器设置,如Xcode中的ENABLE_STRICT_OBJC_MSGSEND,关闭严格检查。 6. 确保使用符合标准的C++版本,避免旧版本的限制。 需要详细说明每个步骤,并提供代码示例,比如如何正确调用全局close函数,如何检查函数声明,以及如何修改编译器设置。同时,要提醒用户注意宏可能带来的问题,特别是在旧标准中空宏参数的问题,但当前错误可能与宏无关,但需要排除。 最后,总结解决方案,帮助用户系统地排查问题,并预防未来类似错误的发生。</think>针对C++编译错误`too many arguments to function call, expected 0, have 1`,以下是具体分析和解决方案: --- ### 一、错误原因分析 此错误表示**函数调用时的参数数量与声明或定义的参数数量不匹配**。结合你提供的引用[^1][^2],常见场景包括: 1. **函数原型声明为无参数**,但调用时传递了参数。 2. **作用域冲突**(如C标准库函数被其他同名函数覆盖)。 3. **编译器严格模式**(如Xcode的`ENABLE_STRICT_OBJC_MSGSEND`设置)。 4. **宏或预处理器干扰**(引用[^4]的空宏参数问题)。 --- ### 二、具体解决方案 #### 1. **检查函数声明与定义是否一致** 若函数声明为`void close();`(无参数),但调用时使用`close(video_fd)`,则参数数量不匹配: ```cpp // 错误声明 void close(); // 正确声明(需与调用匹配) void close(int fd); ``` #### 2. **处理作用域冲突** 当调用C标准库函数(如`::close`)时,若存在同名函数或类成员函数,需显式指定作用域: ```cpp // C标准库的close函数需全局作用域符号 ::close(video_fd); // 正确调用全局close ``` #### 3. **编译器设置调整(针对Xcode/MacOS环境)** 若涉及Objective-C混合编程,按引用[^2]修改编译设置: 1. 进入项目`Build Settings` 2. 搜索`ENABLE_STRICT_OBJC_MSGSEND` 3. 将其设置为`NO` ![Xcode设置示例](https://via.placeholder.com/600x200?text=ENABLE_STRICT_OBJC_MSGSEND+%3D+NO) #### 4. **检查宏定义干扰** 若代码中存在宏替换导致参数数量变化: ```cpp #define CLOSE() ::close() // 错误宏(无参数) CLOSE(video_fd); // 展开后参数不匹配 ``` 需修正宏定义: ```cpp #define CLOSE(fd) ::close(fd) // 正确宏 ``` --- ### 三、代码验证示例 假设错误代码为: ```cpp #include <unistd.h> class FileHandler { public: void close() { /* 类成员函数 */ } void process() { close(video_fd); // 错误:成员函数close无参数 } private: int video_fd; }; ``` 修正方式: ```cpp void process() { ::close(video_fd); // 显式调用全局close } ``` --- ### 四、预防措施 | 场景 | 预防方法 | |---------------------|--------------------------------------------------------------------------| | 函数声明不一致 | 使用头文件(`.h`)统一声明,避免手动重复定义 | | 作用域冲突 | 调用C库函数时显式添加`::`前缀 | | 编译器兼容性问题 | 统一开发环境配置(如C++标准版本、编译标志) | --- ### 五、扩展思考 1. **为何C++允许同名函数存在不同作用域?** 这是C++名称查找规则(Name Lookup)的特性,优先在当前作用域查找函数[^3]。 2. **如何避免参数类型不匹配?** 使用`static_assert`或类型特征检查(C++11+)。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值