9

GCC を使用すると、次のコードの 2 行目で「初期化要素が定数ではありません」というエラーが表示されます。

uint8_t gBuffer[512 + 4]; /* Data buffer */
uint8_t* gAlignedBuffer = (uint8_t*)(((uint32_t)gBuffer + 4) & 0xFFFFFFFCU);   /* Align buffer to 4-byte boundary */ 

ただし、 & 0xFFFFFFFCU を + 0xFFFFFFFFCU に変更すると、コードは正常にコンパイルされます。

uint8_t gBuffer[512 + 4]; /* Data buffer */
uint8_t* gAlignedBuffer = (uint8_t*)(((uint32_t)gBuffer + 4) + 0xFFFFFFFCU);   /* Align buffer to 4-byte boundary */ 

どうしてこれなの?

4

3 に答える 3

2

どうやら、ファイルスコープで変数を宣言しているようです。ファイル スコープ変数には静的な保存期間があり、定数の初期化子が必要です。

イニシャライザは、(言語仕様で定義されている) アドレス定数式の最も厳密で狭い定義を正確には満たしていませんが、特定のコンパイラでサポートされている可能性があります。あなたが観察する矛盾には、存在する本当の理由はありません。これは、その特定のコンパイラの癖だと思います。

于 2013-06-28T14:27:07.010 に答える
2

これらの変数はファイルスコープであるため、静的ストレージを持っているため、動作は出力ファイル形式がサポートする再配置の種類に関係しています (ELF だと思います)。

基本的に、この場合、ELF オブジェクトは未知のアドレスへの任意の数値の追加をサポートしますが、マスクの適用はサポートしません (これは基本的に&操作が行うことです)。2 番目のステートメントを関数に移動する必要があります。

于 2013-06-28T14:31:24.570 に答える