2009-03-29 1 views
11

この質問はSymbian OSに関連していますが、私はC/C++のベテランも私を助けることができると思います。 私はSymbian OS用のオープンソースライブラリをコンパイルしています。 GCCEコンパイラを使用すると、エラーなしでコンパイルできます。 私はARMV5にコンパイラを変更し、今私は静的定数の構造体の定義と複数のエラーを持って、例えば: 私が構造を持っている:static const structsを定義しています

typedef struct Foos{ 
    int a; 
    int b; 
} Foos; 

と型のconstの構造体の次の定義FOOS

static const Foos foo = { 
    .a = 1, 
    .b = 2, 
}; 

GCCEはこれに問題はなく、ARMV5は ".a = 1、.b = 2、"の "expected an expression"エラーになります。私はこれについて、私は、このメソッドはCで合法的であるが、C + +で違法であるはずだと思ったから、その場合、C言語でconst構造体を宣言する可能性は何ですか?そうでない場合は、他の助けに感謝します。事前に

感謝:)

答えて

13
static const struct Foos foo = { 1, 2 }; 

をg ++とgccの両方でコンパイルします。

typedef struct Foos { 
    int a; 
    int b; 
    Foos(int a, int b) : a(a), b(b) {} 
}; 

あなたがそうのようinitalizeます:

static const struct Foos foo(1, 2); 
+0

ありがとうございます!作業されたフィールド名を削除します。 – dudico

4

ドットスタイルの表記は、私がANSI C99に有効と考えているonebyoneが指摘するように

あなたは勿論、コンストラクタを定義することができます。 ANSI C89は無効です。ほとんどすべてのCコンパイラはC99を実装していません。

+1

gccは、コマンドラインオプションなしでドットスタイル表記をサポートしています。他のCコンパイラはありますか? :O –

+0

悲しいことに、はい。 AFAIKがC言語サポートをフリーズしているMSVC。 –

5

これは合法的なC99ですが、合法的なC89やC++ではありません。おそらくこれをC++としてコンパイルしているので、コンパイラオプションを使用して標準準拠を実施すると、GCCEもそれを拒否します。

foo = {1, 2};は、CまたはC++で実行できます。当然のことながら、フィールド名の利点を失うことは明らかです。注文権を得ることに頼る必要があります。

C++のもう1つの良い選択肢は、構造体のコンストラクタを定義し、static const Foos foo(1,2);で初期化することです。しかし、これは構造体がPODであるのを防ぎます。したがって、メモリ内でのその表現について同じ仮定をすることはできません。

5

writable static dataは、Symbianの一部のバージョンのDLLではサポートされていません。あなたの例がconstなのか、Symbian v8.1b以降しかサポートしていないので、あなたがやっていることには影響しないかもしれません。

私はそのトラップに一度落ちたので、私はそれを指摘すると思った。上記のリンクから

引用:シンビアンOS上のグローバル書き込み可能な静的 データの

サポート

のSymbian OSは、グローバル書き込み可能にすべてのバージョン と携帯電話上のEXEで 静的データをサポートしています。

に基づくSymbian OSのバージョンEKA2カーネル(8。1b以降)は、ターゲットハードウェアのDLLに WSDをサポートしています。 バージョン8.1aおよびそれ以前では、 EKA1カーネルに基づいて、DLL内にグローバル WSDをサポートしていません。

+0

さて、私は8.1以前のOSでの静的データの限界を知っています。私は9.1以降のライブラリを使用しています。とにかくその重要なメモを作ってくれてありがとう! – dudico