Ken*_*and 8 c xcode objective-c
我正在使用Xcode 4.6,我有一个头文件,其中包含我在整个代码中使用的一些常量.我不想使用预处理器指令,因为我希望它们被正确键入等等.
例如,我在我的一个.h文件中有这个代码:
static NSString *kErrorCannotDivideByZero = @"Error: Cannot divide by zero";
Run Code Online (Sandbox Code Playgroud)
我在相应的.m文件中使用它:
[self showToast:kErrorCannotDivideByZero];
Run Code Online (Sandbox Code Playgroud)
我收到警告:
/path/to/my/headerFile.h:32:18: Unused variable 'kErrorCannotDivideByZero'
Run Code Online (Sandbox Code Playgroud)
我知道这只是一个警告,但我有大约50个这些警告堵塞了我的编译器输出.
为什么我收到此警告以及如何妥善解决?
我对简单地压制所有未使用的变量警告并不感兴趣,因为我确实希望得到合法的警告.
dre*_*lax 15
在标题中进行声明extern而不是static.你正在做的是为包含你的标题的每个翻译单元创建一个变量,这就是Clang警告你的原因,因为它是合法的未被使用的定义变量.该extern关键字告诉编译器变量的定义是在其他地方找到的(它可能在同一个翻译单元中,也可能在另一个中).
在标题中,有:
// declare that the constant exists somewhere
extern NSString * const kErrorCannotDivideByZero;
Run Code Online (Sandbox Code Playgroud)
而在一个你的.m文件(通常是共享相同的名称作为标题中的一个),把
// define the constant, i.e. this is where it exists
NSString * const kErrorCannotDivideByZero = @"Error: Cannot divide by zero";
Run Code Online (Sandbox Code Playgroud)
声明变量extern允许编译器确保正确处理变量,即使它不知道它的定义位置(例如,您不能将其用作NSArray).链接器的工作是确保您实际在某处定义它.
Jos*_*ell 12
Clang将允许您在"诊断"堆栈上推送和弹出警告标志:"通过编译指示控制诊断".你可以像这样包装某些代码片段:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
static NSString *kErrorCannotDivideByZero = @"Error: Cannot divide by zero";
#pragma clang diagnostic pop
Run Code Online (Sandbox Code Playgroud)
告诉Clang你知道这些没用过,在这个特殊的例子中没关系.
顺便提一下,您可能不希望在导入到许多不同位置的文件中定义这些变量 - 这是导致链接器有关变量重定义的错误的好方法(尽管只有在变量全局链接时才会发生这种情况 - 声明/定义没有 static).像这样的常量的通常模式是在头文件中放置一个extern 声明,并在另一个文件中定义该变量.有关详细信息,请参阅从另一个类引用静态NSString*const.
正如dreamlax指出的那样,你实际上是在收到这些警告,因为每个导入你标题的文件都会得到它自己的static变量副本; 当我提出上述#pragma技术时,我误解了你的要求.
| 归档时间: |
|
| 查看次数: |
3728 次 |
| 最近记录: |