在Cocoa-Touch的标题中放置了“const double NA = 1e-300”错误但不是Cocoa?

时间:2012-05-03 20:13:12

标签: objective-c xcode cocoa-touch cocoa

我尝试将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

3 个答案:

答案 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

定义任何常量表达式。这将解决所有链接问题,因为值被“置于”使用它的代码中,而不是使其成为(常量)变量。