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

发布于 2024-09-30 14:13:23 字数 525 浏览 9 评论 0原文

我可以在 g++ 中以字符串常量形式获取对象的地址吗?示例:

struct s { } x;

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

编辑

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

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

我不知道如何使用预处理器宏构造损坏的名称,所以我问了这个问题。

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

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

Can I get the address of an object as a string constant in g++? Example:

struct s { } x;

If &x == 1234, then I need "1234" in my code.

EDIT:

By string constant I meant that I need that constant string at compile- or link-time. I need to embed it in inline assembly code like this:

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

I don't know a way to construct the mangled name with a preprocessor macro, so I asked this question.

The solution doesn't need to be portable, g++ is sufficient.

The address itself is known at compile- or link-time though, as it would work to examine the assembly output and put in the mangled name into the inline assembly instruction.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

猫腻 2024-10-07 14:13:23

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

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

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

编辑:如果你想在编译时执行此操作...呃...我敢假设这是不可能的

I wonder why would you need that... but you can do this:

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

ss.str() now contains your desired string

edit: If you want to do this compile-time... erm... I'll dare assume it's impossible?

蝶…霜飞 2024-10-07 14:13:23
template<class U>
struct T {
  static int x;
  void f () {
    asm (".word %0" : "m" (&x));
  }
};

对我有用 g++

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

This works for me in g++.

り繁华旳梦境 2024-10-07 14:13:23

您可以这样做

asm(".word x")

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

You can do

asm(".word x")

(it will work only for file-scope variables symbols as only they potentially get a symbol table entry). It's not constant expression, but the address is anyway not known until the program is fully linked.

柏林苍穹下 2024-10-07 14:13:23

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

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

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

In C, you could do this, but, in C, as you are using char *'s as your strings, you need something like this:

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

That prints the range of memory the string is in, istead of the starting adress.

假扮的天使 2024-10-07 14:13:23

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

The error output operand constraint lacks = is because haven't operator = before of the operator out m. Take =m

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文