c ++:地址到字符串常量

时间:2010-11-03 12:11:58

标签: c++ string constants memory-address

我可以在g ++中将对象的地址作为字符串常量获取吗?例如:

struct s { } x;

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

修改

通过字符串常量我的意思是我需要在编译或链接时使用该常量字符串。我需要将它嵌入内联汇编代码中,如下所示:

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

我不知道用预处理器宏构造受损名称的方法,所以我问了这个问题。

解决方案不需要是可移植的,g ++就足够了。

地址本身在编译或链接时是已知的,因为它可以检查程序集输出并将损坏的名称放入内联汇编指令。

5 个答案:

答案 0 :(得分:4)

我想知道你为什么需要那个......但你可以这样做:

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

ss.str()现在包含您想要的字符串

编辑 如果你想做这个编译时......呃...我敢于假设 这是不可能的

答案 1 :(得分:3)

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

works中的g++

答案 2 :(得分:1)

你可以做到

asm(".word x")

(它仅适用于文件范围变量符号,因为它们只能获得符号表条目)。它不是常量表达式,但在程序完全链接之前,地址无论如何都不知道。

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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