0

Cocoa-Touchのヘッダーファイルに配置しようとしましconst double NA = 1e-300;たが、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 for Architecture 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」という名前の変数を宣言および定義しているためです。したがって、リンカは同じ名前の2つの変数を取得しますが、これはルールに違反します。(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;
于 2012-05-03T20:57:23.750 に答える
1

あなたは定義することができます:

#define NA 1e-300

定数式を定義します。これにより、値が(定数)変数ではなく、それを使用するコードに「配置」されるため、すべてのリンクの問題が解決されます。

于 2012-05-03T20:24:31.707 に答える