我试图将const double NA = 1e-300;
放在Cocoa-Touch的头文件中,但Xcode不喜欢它。 但是,当我在 Cocoa(64 位 MAC)中执行此操作时,它工作得很好。
????????
错误:
重复符号_NA /Users/jdl/Library/Developer/Xcode/DerivedData/iExperiment-chcmotcyeolxeacnidtlgofkcihz/Build/Intermediates/iExperiment.build/Debug-iphonesimulator/iExperiment.build/Objects-normal/i386/ViewController.o 和 /users/jdl/Library/Developer/Xcode/DerivedData/iExperiment-chcmotcyeolxeacnidtlgofkcihz/Build/Intermediates/iExperiment.build/Debug-iphonesimulator/iExperiment.build/Objects-normal/i386/AppDelegate.o 适用于架构 i386
命令 /developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/clang 失败,退出代码为 1
#import <UIKit/UIKit.h>
const double NA = 1e-300; // <------------- Error in Cocoa-Touch but not Cocoa ??
// So where do I put this so it doesn't error out in Cocoa-Touch??
@interface ViewController : UIViewController
{
UITextView *tvText;
}
@end
头文件中定义的常量应如下所示:
__unused static const double NA = 1e-300;
__unused
是禁止对未使用的变量发出编译器警告,static
可防止常量向链接器公开,这将解决您的问题。
出现错误的原因是,您在包含 .h 文件的每个 .m 文件中声明并定义了一个名为"NA"的变量。因此,链接器获得两个同名的变量,这是违反规则的。(C++/ObjC++有额外的规则来处理这个问题,但它们不适用于C/ObjC。
如果你不关心有一个实际的变量,你可以使用预处理器,正如kuba的答案所描述的那样。
如果需要实际变量,则必须决定是希望所有编译单元共享该变量,还是在每个编译单元中具有单独的副本。换句话说,你想要一个外部变量,还是一个静态变量?
对于外部:
ViewController.h:
extern const double NA;
ViewController.m:
const double NA = 1e-300;
对于静态:
ViewController.h:
static const double NA = 1e-300;
你可以定义一下:
#define NA 1e-300
定义任何常量表达式。这将解决所有链接问题,因为该值被"放入"使用它的代码中,而不是使其成为(常量)变量。