Нахождение имени переменной в C - PullRequest
3 голосов
/ 24 сентября 2008

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

Если у человека есть определение, например:

#define count 1

Может ли этот человек найти имя переменной count, используя 1, находящуюся внутри нее?

Я так не думал, так как думал, что счет будет указывать на 1, но не вижу, как 1 может указывать на счет.

Ответы [ 18 ]

0 голосов
/ 24 сентября 2008

Это не указатель, это просто подстановка строки / токена. Препроцессор заменяет все #define до того, как ваш код когда-либо скомпилируется. Большинство компиляторов включают аргумент -E или аналогичный для генерации предварительно скомпилированного кода, поэтому вы можете видеть, как выглядит код после обработки всех #directives.

Если говорить прямо о вашем вопросе, то нельзя сказать, что токен заменяется в коде. Ваш код не может даже определить разницу между (count == 1) и (1 == 1).

Если вы действительно хотите это сделать, это может быть возможно с помощью анализа текста исходного файла, например, с помощью инструмента diff.

0 голосов
/ 24 сентября 2008

Если они смотрят на исходный код C (который они будут в отладчике), то они увидят что-то вроде

int i = count;

в этот момент они могут искать и находить строку

#define count 1

Если, однако, все, что у них есть, это переменная iDontKnowWhat, и они могут видеть, что она имеет значение 1, то нет способа отследить это до 'count'.

Почему? Поскольку #define оценивается во время препроцессора, что происходит еще до компиляции (хотя почти для всех это можно рассматривать как первый этап компиляции). Следовательно, исходный код является единственной вещью, которая имеет какую-либо информацию о «счете», например, зная, что она когда-либо существовала. К тому времени, когда компилятор заглядывает, каждая ссылка на «count» заменяется числом «1».

0 голосов
/ 24 сентября 2008

В случае макроса это предварительно обрабатывается и результирующий вывод компилируется. Таким образом, абсолютно невозможно найти это имя, потому что после того, как препроцессор завершит свою работу, результирующий файл будет содержать «1» вместо «count» везде в файле.

Так что ответ - нет.

0 голосов
/ 24 сентября 2008

#define - это директива препроцессора, поэтому она не является «переменной»

0 голосов
/ 24 сентября 2008

В общем, нет.

Во-первых, #define - это не переменная, это макрос препроцессора компилятора.

К тому времени, когда основная фаза компилятора приступит к работе, имя будет заменено значением, и имя "count" больше не будет нигде в компилируемом коде.

Для переменных невозможно найти имена переменных в коде C во время выполнения. Эта информация не сохраняется. В отличие от языков, таких как Java или C #, C вообще не хранит много метаданных в компиляциях вплоть до ассемблера.

0 голосов
/ 24 сентября 2008

То, что у вас есть, на самом деле не переменная, это директива препроцессора. Когда вы скомпилируете код, препроцессор выполнит его и заменит все значения слова count в этом файле на 1.

Возможно, вы спрашиваете, знаю ли я 1, могу ли я найти это количество очков? Нет. Поскольку связь между именами переменных и значениями не является биекцией, пути назад нет. Рассмотрим

int count = 1;
int count2 = 1;

совершенно законно, но что я должен решить?

0 голосов
/ 24 сентября 2008

Директива, начинающаяся с «#», обрабатывается препроцессором, который обычно выполняет подстановку текста перед передачей кода в «настоящий» компилятор. Таким образом, нет переменной с именем count, как будто все строки «count» в вашем коде волшебным образом заменены на строку «1».

Так что нет, нет способа найти эту "переменную".

0 голосов
/ 24 сентября 2008

Что вы подразумеваете под "находкой"?

Линия

#define count 1

определяет символ "count" со значением 1.

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

if (x > count) ...

будет заменено на:

if (x > 1) ...

Если вы поймете это, вы сможете понять, почему «найти счет» бессмысленно.

...