在可可触摸而不是可可的标题中放置"const double NA = 1e-300"错误?



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

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

最新更新