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

在 C 中,你可以这样做,但是,在 C 中,当你使用char *'s 作为你的字符串时,你需要这样的东西:

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

打印字符串所在的内存范围,而不是起始地址。

于 2010-11-03T12:15:41.693 回答
0

错误输出操作数约束缺少是因为操作符 out 之前=没有操作符。拿=m=m

于 2012-04-13T12:05:14.757 回答