如何使用带有"未使用变量"警告的类型常量?

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技术时,我误解了你的要求.