次のコードがあります。
struct str {
int a;
int b;
};
extern struct str c;
アセンブリ(GNU asを使用)では、メモリの場所を次のc
ように設定できます。
.global c
.set c, 0x12345678
Cでこれを移植可能にする方法はありますか? このコードはマイクロコントローラー用であるため、「悪い習慣」とは見なしません。
次のコードがあります。
struct str {
int a;
int b;
};
extern struct str c;
アセンブリ(GNU asを使用)では、メモリの場所を次のc
ように設定できます。
.global c
.set c, 0x12345678
Cでこれを移植可能にする方法はありますか? このコードはマイクロコントローラー用であるため、「悪い習慣」とは見なしません。
はいといいえ。基本的にどのコンパイラでもコンパイルできるコードを書くことができます。その後どうなるかは人それぞれですが。
struct str *c = (struct str *)0x12345678;
私が言ったように、これはほぼすべてのコンパイラでコンパイルする必要があります (ただし、使用する数値がアドレスに変換できないとコンパイラが判断した場合は拒否される可能性があります)。ポインターを逆参照しようとすると、コンパイラーがそれを実際のアドレスに変換する方法 (さまざまですが、マシンのアドレス指定を知っている人が期待するものになるように意図されています) と、それが生成するアドレスが実際に持っているアドレスであるかどうかによって異なります。アクセス権 (もしそうなら、あなたが持っている正確なアクセス権)。