12

この質問は Symbian OS に関連していますが、C/C++ のベテランも私を助けることができると思います。オープン ソース ライブラリを Symbian OS にコンパイルしています。GCCEコンパイラを使用すると、エラーなしでコンパイルされます(いじくり回した後:))。コンパイラをARMV5に変更したところ、静的const構造体の定義で複数のエラーが発生しました。たとえば、構造体があります:

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

そして、Foos 型の const 構造体の次の定義

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

GCCE ではこれに問題はなく、ARMV5 では ".a = 1, .b = 2," で "expected an expression" エラーが発生します。これに関して私がグーグルで検索したことから、このメソッドは C では合法であるが、C++ では違法であると考えられます。その場合、C++ で const 構造体を宣言する可能性は何ですか? そうでない場合は、他のヘルプをいただければ幸いです。

前もって感謝します :)

4

4 に答える 4

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

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

もちろん、onebyone が指摘しているように、コンストラクターを定義することもできます。

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

次のように初期化します。

static const struct Foos foo(1, 2);
于 2009-03-29T14:36:00.267 に答える
5

書き込み可能な静的データは、Symbianの一部のバージョンのDLLではサポートされていないことに注意してください。例がconstであるか、Symbian v8.1b以降のみをサポートしている可能性があるため、実行していることに影響しない場合があります。

一度その罠に陥ったので指摘したいと思いました。

上記のリンクからの引用:

SymbianOSでのグローバルな書き込み可能な静的データのサポート

Symbian OSは、すべてのバージョンとハンドセットのEXEでグローバルに書き込み可能な静的データをサポートします。

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

于 2009-03-29T20:05:48.773 に答える
5

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

foo = {1, 2};C または C++ で実行できます。明らかに、フィールド名がすぐそこにあるという利点が失われます。順序を正しくすることに頼らなければなりません。

C++ のもう 1 つの適切なオプションは、構造体のコンストラクターを定義し、 で初期化することstatic const Foos foo(1,2);です。ただし、これにより構造体が POD になるのを防ぐことができるため、メモリ内での表現について同じ仮定を行うことはできません。

于 2009-03-29T14:47:06.887 に答える
4

ドットスタイル表記は ANSI C99 で有効だと思います。ANSI C89 は有効ではありません。ほとんどすべての C コンパイラは C99 を実装していません。

于 2009-03-29T14:38:05.877 に答える