問題タブ [c17]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
83 参照

c - どの暗黙の宣言が許可/有効ですか?

と知られている:

  • 関数の暗黙の宣言が無効です
  • 変数の暗黙の宣言が無効です

どの暗黙の宣言が許可/有効ですか?

一例は識別子__func__です。他の例はありますか?

0 投票する
2 に答える
91 参照

c - clang/gcc はグローバル変数をアドレス定数から別のアドレス定数を差し引いた値に設定できません

以下のプログラムは、エラーなしでコンパイルされます。

興味深いことに、unsigned long my_addr = (unsigned long)addr_b - (unsigned long)addr_aコンパイラを設定すると、「エラー: 初期化要素が定数ではありません」というメッセージがスローされます。

グローバルは定数式でのみ初期化できることを知っています。また、グローバルのイニシャライザで使用できる定数式のタイプは、C 標準のセクション 6.6p7 で指定されていることも知っています。

初期化子の定数式には、より多くの自由度が許可されています。このような定数式は、次のいずれかになるか、評価されます。

  • 算術定数式、
  • null ポインター定数、
  • アドレス定数、または
  • 完全なオブジェクト型のアドレス定数プラスまたはマイナスの整数定数式。

アドレス定数から整数定数を引いたものは許可されますが、アドレス定数から別のアドレス定数を引いたものは許可されないことに注意してください。

質問:

C 標準がグローバル変数の初期化方法を制限しているのはなぜですか? C標準が受け入れるのを妨げているのは何unsigned long my_addr = (unsigned long)addr_b - (unsigned long)addr_aですか?

なぜこれが欲しいのですか?

とがそれぞれセクションの開始と終了を表しているとしaddr_aます。プログラムは、 size を持つセクションをマップしたい場合があります。trusted-firmware-aプロジェクトは、ブート ローダー ステージ 2 (BL2) でこれを行います。arm_bl2_setup.cで使用されている を参照してください。addr_b.text.text(unsigned long)addr_b - (unsigned long)addr_aBL_CODE_END - BL_CODE_BASE