Получение переменной динамически в c - PullRequest
3 голосов
/ 05 марта 2010

У меня есть одно требование в C.

char abc[]="hello";
char hello[]="world";

Используя abc, можем ли мы получить значение переменной hello в C. Я знаю, что это возможно в некоторых языках, таких как Perl, Php, Bash,

.

Возможно ли это в C?

Ответы [ 6 ]

2 голосов
/ 05 марта 2010

Да, вы правы, это возможно на другом языке, но не на C, поскольку abc - это контейнер, который находится в определенном месте (например, 1000), и hello - это еще один контейнер, который находится в другом месте (например,: 2000), поэтому у нас нет контакта между этими двумя массивами,

мы не можем создать значение (строки), чтобы указать какое-то другое значение.так что, наконец, ЭТОГО НЕ ВСЕ ВОЗМОЖНО.

2 голосов
/ 05 марта 2010

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

1 голос
/ 05 марта 2010

Как только компилятор C выяснил, где хранить основные указатели, он забывает о названии, которое вы ему дали. Динамические языки решают ее с помощью структуры данных, такой как хэш-карта, которая позволяет хранить указатели (значения) под ключом (именем).

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

1 голос
/ 05 марта 2010

Это невозможно в C, в отличие от более динамичных языков, таких как Perl или Python. Однако важно помнить, что даже на этих языках это не рекомендуется. Я еще не видел фрагмента кода, который бы использовал его для хорошего использования. Методы eval, доступные в динамических языках, используются экономно, а не для динамического получения имен переменных.

0 голосов
/ 05 марта 2010

POSIX имеет несколько функций, которые позволяют вам это делать, предполагая, что переменная hello является глобальной и не является статической:

void *handle = dlopen(NULL, RTLD_NOW);
// error handling omitted

printf("%s variable contains value %s", abc, (char *)dlsym(handle, abc));

dlsym() возвращаемое значение преобразуется в char * для подавления предупреждения при использовании компиляторов, которые проверяют строку формата для printf -подобных функций.

И вам нужно убедиться, что вы указали правильные параметры компилятора, например, -rdynamic -ldl в случае GCC.

0 голосов
/ 05 марта 2010

Это не возможно в C. Это может быть сделано в Java путем отражения в некоторых случаях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...