2

オブジェクトのアドレスをg++の文字列定数として取得できますか?例:

struct s { } x;

の場合&x == 1234、コードが必要"1234"です。

編集

文字列定数とは、コンパイル時またはリンク時にその定数文字列が必要であることを意味します。次のようなインラインアセンブリコードに埋め込む必要があります。

template < typename U >
struct T {
  static int x;
  void f () {
    asm (".word " some-expression-containing-(&x));
  }
};

プリプロセッサマクロを使ってマングルされた名前を作成する方法がわからないので、この質問をしました。

ソリューションは移植可能である必要はなく、g++で十分です。

ただし、アドレス自体はコンパイル時またはリンク時に認識されます。これは、アセンブリ出力を調べて、マングルされた名前をインラインアセンブリ命令に挿入するために機能するためです。

4

5 に答える 5

4

なぜそれが必要なのだろうか...しかし、これを行うことができます:

#include <sstream>
#include <cstddef> //for ptrdiff_t
....
stringstream ss;
ss << reinterpret_cast<ptrdiff_t>(&x);

ss.str()目的の文字列が含まれるようになりました

編集:もしあなたがこのコンパイル時をやりたいのなら...うーん...それは不可能だとあえて思いますか?

于 2010-11-03T12:13:43.970 に答える
3
template<class U>
struct T {
  static int x;
  void f () {
    asm (".word %0" : "m" (&x));
  }
};

これはg++で機能します。

于 2010-11-03T12:48:57.447 に答える
1

できるよ

asm(".word x")

(シンボル テーブル エントリを取得する可能性があるため、ファイル スコープ変数シンボルに対してのみ機能します)。定数式ではありませんが、プログラムが完全にリンクされるまでアドレスはわかりません。

于 2010-11-03T12:33:02.267 に答える
0

エラー出力オペランド制約が不足しているのは、演算子 out の前に=演算子がないためです。取った=m=m

于 2012-04-13T12:05:14.757 に答える
0

C ではこれを行うことができますが、C ではchar *文字列として 's を使用しているため、次のようなものが必要です。

printf("%i-%i", &string[0], &string[strlen(string) - 1]);

これは、開始アドレスではなく、文字列が存在するメモリの範囲を出力します。

于 2010-11-03T12:15:41.693 に答える