我可以将对象的地址作为g ++中的字符串常数吗?例子:

struct s { } x;

如果 &x == 1234, ,那我需要 "1234" 在我的代码中。

编辑:

通过字符串常数,我的意思是我需要在compile-或链接时间处进行常数字符串。我需要将其嵌入这样的内联汇编代码中:

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

我不知道用预处理器宏来构建混乱的名称的方法,所以我问了这个问题。

该解决方案不需要便携,G ++就足够了。

地址本身是在编译或链接时间上知道的,因为它可以检查组件输出并将其放入内联汇编指令中。

有帮助吗?

解决方案

template<class U>
struct T {
  static int x;
  void f () {
    asm (".word %0" : "m" (&x));
  }
};

作品 对我来说 G ++.

其他提示

我想知道为什么您需要...但是您可以做到这一点:

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

ss.str() 现在包含您所需的字符串

编辑: 如果您想做这个编译时间...嗯...我敢假设 不可能?

你可以做

asm(".word x")

(它将仅适用于文件范围变量符号,因为它们可能只能获得符号表条目)。这不是恒定的表达,但是在程序完全链接之前,该地址是不知道的。

在C中,您可以执行此操作,但是,在C中,您正在使用 char *作为弦,您需要这样的东西:

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

打印字符串所在的内存范围,启动地址的iStead。

错误输出操作数约束缺乏 = 是因为没有操作员 = 在操作员之前 m. 。拿 =m

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top