定数の初期化要素ではありませんか?

ユ・チャン

コンパイラコースのセマンティック分析を行っているときに、紛らわしいケースに遭遇しました。

#include <stdio.h>

int a = "abcd"[2];

int main()
{
    char b = "abcd"[2];

    printf("%d\n%c\n", a, b);

    return 0;
}

GCCは、変数「a」に対して「エラー:初期化要素が定数ではありません」と言います。

どうして?

sepp2k

C言語では、グローバル変数の初期化子が定数式である必要があります。この背後にある動機は、コンパイラがコンパイル時に式を計算し、計算された値を生成されたオブジェクトファイルに書き込むことができるようにすることです。

C標準は、定数式とは何かに関する特定の規則を提供します。

  1. 整数定数式117)は整数型であり、整数定数、列挙定数、文字定数、sizeof結果が整数定数である_Alignof式、式、およびキャストの直接のオペランドである浮動定数であるオペランドのみを持つものとします整数定数式のキャスト演算子は、sizeofor_Alignof演算子のオペランドの一部を除いて、算術型を整数型にのみ変換します。
  2. イニシャライザの定数式には、より広い範囲が許可されます。このような定数式は、次のいずれかであるか、評価されます。
    • 算術定数式、
    • ヌルポインタ定数、
    • アドレス定数、または
    • 完全なオブジェクトタイプのアドレス定数プラスまたはマイナス整数定数式。

ご覧のとおり、配列アクセス式またはポインター逆参照を含むケースはありません。したがって"abcd"[2]、標準による定数式としての資格はありません。

現在、標準には次のようにも書かれています。

  1. 実装は、他の形式の定数式を受け入れる場合があります。

したがって"abcd"[1]、定数式として許可することは標準に違反しませんが、許可されることも保証されません。

したがって、コンパイラで許可するかどうかはあなた次第です。どちらの方法でも標準に準拠します(ただし、isConstantExpressionチェックで別のケースが必要であり、コンパイル時に式を実際に評価できる必要があるため、許可するとより多くの作業が必要になるため、許可しないことにします)。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

25:警告:初期化要素は定数式ではありません

分類Dev

エラー:初期化要素はc言語のコンパイル時定数ではありません

分類Dev

初期化要素が一定ではありませんか?

分類Dev

C初期化要素が一定ではありません[配列と変数の違いは何ですか]

分類Dev

Libcurlの問題-「初期化要素が一定ではありません」

分類Dev

オブジェクトを関数の静的メンバーとして定義する場合の「初期化要素は定数ではありません」

分類Dev

constで変数を初期化しようとすると、「初期化要素が定数ではありません」というエラーが発生します

分類Dev

時間関数をグローバルに宣言するための初期化要素は定数ではありません

分類Dev

グローバル変数の「初期化子が定数ではありません」?

分類Dev

文字列を使用しない場合、初期化要素は一定のエラーではありません

分類Dev

C-constの問題-エラー:初期化要素が一定ではありません

分類Dev

verilogでFSMの状態の初期化または変更はありません

分類Dev

const int x = 5である理由; Cの定数式ではありませんか?

分類Dev

Javaアノテーション:変数の初期化時、割り当てではありませんか?

分類Dev

C ++ 11-参照の初期化は式(の一部)ではありませんか?

分類Dev

GCCは初期化要素を一定ではなく、ARMCCは一定ではありません

分類Dev

Const初期化子 'protoimpl.EnforceVersion(20-protoimpl.MinVersion)'は定数ではありません

分類Dev

均一な初期化を使用するのは危険ではありませんか?

分類Dev

Verilog:「...は定数ではありません」

分類Dev

rspec binstub(bin / rspec)の初期化されていない定数エラーですが、rspec自体にはありません

分類Dev

firebase.authは関数ではありません-複数のfirebaseアプリの初期化があります

分類Dev

os.Getenvを使用してgolangで定数を宣言すると、 'os.Getenv( "MY_SECRET")のconst初期化子は定数ではありません'になります。

分類Dev

SKShapeNode(circleOfRadius:radius)の指定された初期化はありません

分類Dev

マイクロコントローラーC:初期化要素が一定ではありません

分類Dev

C ++ 11の一様初期化:フィールド初期化子は一定ではありません

分類Dev

C ++:同じ型の定数から列挙値を初期化できません

分類Dev

Checkstyleは定数の商式が好きではありません

分類Dev

LVMは表示されますが、初期化できません。いずれかのディスクのUUIDがありません

分類Dev

Cのグローバル変数リンクリストキュー?(初期化要素は一定ではありません)

Related 関連記事

  1. 1

    25:警告:初期化要素は定数式ではありません

  2. 2

    エラー:初期化要素はc言語のコンパイル時定数ではありません

  3. 3

    初期化要素が一定ではありませんか?

  4. 4

    C初期化要素が一定ではありません[配列と変数の違いは何ですか]

  5. 5

    Libcurlの問題-「初期化要素が一定ではありません」

  6. 6

    オブジェクトを関数の静的メンバーとして定義する場合の「初期化要素は定数ではありません」

  7. 7

    constで変数を初期化しようとすると、「初期化要素が定数ではありません」というエラーが発生します

  8. 8

    時間関数をグローバルに宣言するための初期化要素は定数ではありません

  9. 9

    グローバル変数の「初期化子が定数ではありません」?

  10. 10

    文字列を使用しない場合、初期化要素は一定のエラーではありません

  11. 11

    C-constの問題-エラー:初期化要素が一定ではありません

  12. 12

    verilogでFSMの状態の初期化または変更はありません

  13. 13

    const int x = 5である理由; Cの定数式ではありませんか?

  14. 14

    Javaアノテーション:変数の初期化時、割り当てではありませんか?

  15. 15

    C ++ 11-参照の初期化は式(の一部)ではありませんか?

  16. 16

    GCCは初期化要素を一定ではなく、ARMCCは一定ではありません

  17. 17

    Const初期化子 'protoimpl.EnforceVersion(20-protoimpl.MinVersion)'は定数ではありません

  18. 18

    均一な初期化を使用するのは危険ではありませんか?

  19. 19

    Verilog:「...は定数ではありません」

  20. 20

    rspec binstub(bin / rspec)の初期化されていない定数エラーですが、rspec自体にはありません

  21. 21

    firebase.authは関数ではありません-複数のfirebaseアプリの初期化があります

  22. 22

    os.Getenvを使用してgolangで定数を宣言すると、 'os.Getenv( "MY_SECRET")のconst初期化子は定数ではありません'になります。

  23. 23

    SKShapeNode(circleOfRadius:radius)の指定された初期化はありません

  24. 24

    マイクロコントローラーC:初期化要素が一定ではありません

  25. 25

    C ++ 11の一様初期化:フィールド初期化子は一定ではありません

  26. 26

    C ++:同じ型の定数から列挙値を初期化できません

  27. 27

    Checkstyleは定数の商式が好きではありません

  28. 28

    LVMは表示されますが、初期化できません。いずれかのディスクのUUIDがありません

  29. 29

    Cのグローバル変数リンクリストキュー?(初期化要素は一定ではありません)

ホットタグ

アーカイブ