iOS警告-This block declaration is not a prototype

本文探讨了在Xcode9中定义不带参数的Block时出现的“不是原型”的警告,并提供了三种解决方案:修改Block定义、使用预编译指令忽略警告及调整项目设置。

关于警告

我们定义一个不带参数的block,通常是如下的方式

1
typedefvoid (^UpdateSwichBtnBlock)();

在xcode9中会提示一个警告

1
2
This block declaration is not a prototype
Insert ‘void'

解决方式可以是如下的几种

1
typedefvoid (^UpdateSwichBtnBlock)(void);

但是这样,很多第三方要改,涉及的面太大了,目前可能不太适合,虽然这个是趋势.

或者,如果只是很少的地方,也可以使用

1
2
3
4
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wstrict-prototypes"
typedefvoid (^UpdateSwichBtnBlock)();
#pragma clang diagnostic pop

彻底的暂时解决所有这种警告的方式

在工程的设置中

1552510-c35b7f2de8d6a831.png

设置为NO,则这些警告就消失了

不过这不是一种好习惯,只是暂时性的不让提示这种类型的警告而已

### 编译器警告 #231-D 的解决方案 编译器警告 #231-D 通常表示某个声明或定义在函数外部不可见。这可能是由于作用域限制、链接问题或其他配置错误引起的。以下是可能的解决方案和相关分析[^1]。 #### 可能原因及解决方法 1. **作用域问题** 如果变量或函数仅在局部作用域中声明,则在其他函数或文件中无法访问。为了解决此问题,可以将声明移至全局作用域或头文件中,确保其可见性。例如,如果某个变量仅在函数内部声明,可以将其声明改为全局变量或通过返回值传递[^1]。 ```cpp // 错误示例:局部变量声明 void func() { int globalVar = 0; // 局部变量,外部不可见 } // 正确示例:全局变量声明 int globalVar = 0; void func() { globalVar = 10; // 修改全局变量 } ``` 2. **静态变量或函数声明** 如果变量或函数被声明为 `static`,则它们的作用域将被限制在当前文件中。如果需要跨文件访问,应避免使用 `static` 关键字,并在头文件中声明外部引用。例如: ```cpp // 文件 A.cpp static int localVar = 0; // 仅在 A.cpp 中可见 // 文件 B.cpp extern int localVar; // 尝试访问 A.cpp 中的 localVar,但会失败 // 解决方案:移除 static 并在头文件中声明 // 文件 A.h extern int localVar; // 文件 A.cpp int localVar = 0; // 文件 B.cpp #include "A.h" ``` 3. **链接器问题** 如果声明正确但仍然出现警告,可能是链接器未正确处理符号。检查项目设置,确保所有源文件均包含在构建过程中。此外,某些编译器可能需要特定标志来启用完整符号表生成。例如,在 GCC 或 Clang 中,可以尝试添加 `-fno-eliminate-unused-debug-symbols` 标志[^1]。 4. **编译器选项配置** 某些编译器警告可以通过调整选项来抑制。然而,建议优先修复代码而非简单禁用警告。对于 GCC 或 Clang,可以使用以下命令检查具体警告信息并定位问题: ```bash gcc -Wall -Wextra -pedantic source.cpp ``` 如果确实需要禁用特定警告,可以使用 `#pragma` 指令或编译器标志。例如: ```cpp #pragma GCC diagnostic ignored "-Wunused-variable" ``` 5. **调试工具辅助** 使用调试工具(如 GDB 或 Valgrind)可以帮助定位变量或函数的作用域问题。此外,静态分析工具(如 clang-tidy 或 cppcheck)也可以检测潜在的作用域冲突或未初始化变量问题[^1]。 #### 示例代码 以下是一个完整的示例,展示如何避免声明不可见的问题: ```cpp // 文件 A.h #ifndef A_H #define A_H extern int sharedVar; void func(); #endif // 文件 A.cpp #include "A.h" int sharedVar = 0; void func() { sharedVar = 10; } // 文件 B.cpp #include "A.h" #include <iostream> int main() { func(); std::cout << "Shared variable value: " << sharedVar << std::endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yusirxiaer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值