c ++: адрес строковой константы - PullRequest
2 голосов
/ 03 ноября 2010

Можно ли получить адрес объекта как строковую константу в g ++?Пример:

struct s { } x;

Если &x == 1234, тогда мне нужно "1234" в моем коде.

EDIT :

По строковой константе Iозначало, что мне нужна эта постоянная строка во время компиляции или компоновки.Мне нужно встроить его во встроенный ассемблерный код, например:

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

Я не знаю, как создать искаженное имя с помощью макроса препроцессора, поэтому я задал этот вопрос.

Решение не должно быть переносимым, достаточно g ++.

Сам адрес известен во время компиляции или компоновки, хотя он будет работать для проверки вывода сборки и вставки искаженного имени ввстроенная инструкция по сборке.

Ответы [ 5 ]

4 голосов
/ 03 ноября 2010

Интересно, зачем вам это нужно ... но вы можете сделать это:

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

ss.str() теперь содержит желаемую строку

edit: Если вы хотите сделать это во время компиляции ... эээ ... я позволю себе предположить это невозможно * * 1015

3 голосов
/ 03 ноября 2010
template<class U>
struct T {
  static int x;
  void f () {
    asm (".word %0" : "m" (&x));
  }
};

Это работает для меня в g ++ .

1 голос
/ 03 ноября 2010

Вы можете сделать

asm(".word x")

(это будет работать только для символов переменных области файла, поскольку только они потенциально могут получить запись в таблице символов).Это не постоянное выражение, но адрес в любом случае неизвестен, пока программа не будет полностью связана.

0 голосов
/ 13 апреля 2012

Отсутствует ограничение вывода операнда = из-за отсутствия оператора = до выхода оператора m.Возьми =m

0 голосов
/ 03 ноября 2010

В C вы можете сделать это, но в C, поскольку вы используете char * в качестве строк, вам нужно что-то вроде этого:

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

Печатает диапазон памяти, в котором находится строка, вместо начального адреса.

...