0

我试图放置const double NA = 1e-300;在 Cocoa-Touch 的头文件中,但 Xcode 不喜欢它。但是,当我在 Cocoa(64 位 MAC)中执行此操作时,它工作得很好。

??????

错误:


/Users/jdl/Library/Developer/Xcode/DerivedData/iExperiment-chcmotcyeolxeacnidtlgofkcihz/Build/Intermediates/iExperiment.build/Debug-iphonesimulator/iExperiment.build/Objects-normal/i386/ViewController.o 和 /Users/ 中的重复符号 _NA 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
4

3 回答 3

3

头文件中定义的常量应如下所示:

__unused static const double NA = 1e-300; 

__unused是为了抑制未使用变量的编译器警告,并static防止将常量暴露给链接器,这将解决您的问题。

于 2012-05-03T20:22:15.960 回答
3

您收到错误的原因是您在包含 .h 文件的每个 .m 文件中声明并定义了一个名为“NA”的变量。所以链接器得到两个同名的变量,这是违反规则的。(C++/ObjC++ 有额外的规则来处理这个问题,但它们不会在 C/ObjC 中发挥作用。)

如果您不关心实际变量,则可以使用预处理器,如 kuba 的回答所述。

如果你想要一个实际的变量,你必须决定是让所有编译单元共享该变量,还是在每个编译单元中都有一个单独的副本。换句话说,你想要一个外部变量,还是一个静态变量?

对于外部:

视图控制器.h:

extern const double NA;

视图控制器.m:

const double NA = 1e-300;

对于静态:

视图控制器.h:

static const double NA = 1e-300;
于 2012-05-03T20:57:23.750 回答
1

你可以定义一个:

#define NA 1e-300

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

于 2012-05-03T20:24:31.707 回答