我尝试将const double NA = 1e-300;
放在Cocoa-Touch的头文件中,但Xcode不喜欢它。但是,当我在Cocoa(64位MAC)中执行此操作时,它的工作正常。
????????
错误:
复制符号_NA in /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
答案 0 :(得分:3)
头文件中定义的常量应如下所示:
__unused static const double NA = 1e-300;
__unused
用于抑制未使用变量的编译器警告,static
可以防止常量暴露给链接器,这将解决您的问题。
答案 1 :(得分:3)
您收到错误的原因是您在每个包含.h文件的.m文件中声明并定义名为“NA”的变量。因此链接器获取两个具有相同名称的变量,这违反了规则。 (C ++ / ObjC ++有额外的规则来解决这个问题,但它们并不适用于C / ObjC。)
如果您不关心实际变量,可以使用预处理器,如描述kuba的答案。
如果需要实际变量,则必须决定是要让变量由所有编译单元共享,还是在每个编译单元中都有一个单独的副本。换句话说,你想要一个外部变量,还是一个静态变量?
对于extern:
ViewController.h:
extern const double NA;
ViewController.m:
const double NA = 1e-300;
对于静态:
ViewController.h:
static const double NA = 1e-300;
答案 2 :(得分:1)
你可以定义:
#define NA 1e-300
定义任何常量表达式。这将解决所有链接问题,因为值被“置于”使用它的代码中,而不是使其成为(常量)变量。