Любая программа или трюк, чтобы найти определение переменной?

Много раз, когда я наблюдаю за чужим кодом, я просто хочу найти, где и как определена переменная. Обычно сейчас я ищу тип переменной, пока не найду определение, что занимает очень много времени. И я предполагаю, что есть некоторые инструменты, которые могут помочь мне в этой рутинной ситуации. Любое предложение в некоторых инструментах или командах, которые помогут мне в этой задаче?

Я знаю, что с помощью графического интерфейса и создания проекта это делается автоматически. Я говорю о способе сделать это без графического интерфейса. Я работаю только с текстовым режимом. Я работаю под Linux и использую C/C++, но предложения по другим языкам приветствуются.

Большое спасибо.

Возможное решение

Мишель в одном из своих комментариев предлагает простое и эффективное решение: снова определить переменную, в этом случае во время компиляции компилятор сообщит, где находится предыдущее определение. Конечно, чтобы применить это решение, нам нужно заранее подумать о местонахождении переменной.


person Eduardo    schedule 17.02.2009    source источник
comment
Вы бы хоть язык указали ;)   -  person devio    schedule 18.02.2009
comment
Я так увлекся C++, что теперь мой разум думает только о том, что существует только один язык   -  person Eduardo    schedule 18.02.2009
comment
Метод переопределения переменной не является решением. У вас разные пространства имен. Например, если вы ищете переменную с именем medium, вы можете определить ее внутри метода или функции или в другом пространстве имен (с таким же именем), и это не будет ошибкой.   -  person Diego Sevilla    schedule 18.02.2009
comment
Когда я говорю об этом возможном решении, я предполагаю, что нужно немного подумать заранее о местоположении переменной   -  person Eduardo    schedule 18.02.2009


Ответы (8)


Изменить: хорошо, вы говорите, что используете C++. Я редактирую свой ответ. Я бы использовал препроцессор C, а затем grep для переменной. Он появится в первую очередь.

cpp -I...(preprocessor options here) file.cpp | grep variable

Препроцессор C присоединит все включения, которые использует программа, и определение должно быть до любого использования этой переменной в файле. Не идеальная вещь, но без IDE или полного инструмента описания/управления языком у вас есть только текст.

Другим вариантом может быть использование ctags. Он понимает синтаксис C и C++ (среди прочего) и может искать переменные и функции с помощью инструментов командной строки, emacs и vi, среди прочего.

person Diego Sevilla    schedule 18.02.2009
comment
Помимо ctags, Semantic — это еще одно дополнение, которое пользователи Emacs могут захотеть проверить: cedet.sourceforge. сеть/semantic.shtml - person codelogic; 18.02.2009
comment
Спасибо, кодологика. Да, я только что обнаружил это и попробовал :) Еще раз спасибо. - person Diego Sevilla; 18.02.2009

Вы уже предоставили наиболее подходящий инструмент: IDE. Это именно то, в чем превосходит IDE. Почему бы вам не использовать IDE, если разработка без нее кажется вам мучительной?

Обратите внимание, что Emacs, Vim и т. д. могут работать как IDE — я не говорю о том, чтобы навязать вам мир графических интерфейсов, если вы хотите оставаться в текстовой ситуации, например. потому что вы подключаетесь по SSH.

(Я на самом деле не пытаюсь быть грубым здесь. Я просто думаю, что вы проигнорировали очевидное решение, не объяснив, почему.)

person Jon Skeet    schedule 18.02.2009
comment
Причина, по которой я отказался от этого, заключается в том, что обычно я использую графический интерфейс, но сейчас я работаю над небольшим проектом только в режиме SSHing и просто ищу что-то простое. Ты не выглядел грубым. Спасибо - person Eduardo; 18.02.2009
comment
В этом случае я бы использовал Emacs в качестве IDE. Я был бы удивлен, если бы где-то не было определения. - person Jon Skeet; 18.02.2009
comment
Насколько я знаю, Emacs не имеет такой функциональности из коробки, хотя две надстройки ctags и Semantic ее предоставляют. - person codelogic; 18.02.2009
comment
100% согласен. Соответствующие ссылки: linuxjournal.com/article/5765 frodo.syminet.com/~deep/emacside.html - person Chuck; 18.02.2009
comment
Эта демонстрация Lightning Talk CppCon 2015 с использованием Emacs в качестве C++ IDE: youtube.com/watch?v=5FQwQ0QWBTU - person Steven C. Howell; 16.11.2016

Я использую cscope и ctags-exuberant неукоснительно. Запустив его один раз в моей кодовой базе, а затем в Vim, я могу использовать различные команды, такие как ^] или [D или [I или аналогичные), чтобы найти любые определения или объявления для данного слова.

Это похоже на средства, предоставляемые такими мега-IDE, как Visual Studio и Eclipse.

Cscope также функционирует как автономный инструмент, который выполняет эти поиски.

person greyfade    schedule 18.02.2009

Я использую один из трех способов:

  1. Я буду использовать CTags для обработки исходного дерева (ежедневно), а затем смогу легко использовать команды в Vim. (или другие редакторы), чтобы сразу перейти к определению.
  2. Я просто использую grep (linux) или findstr (windows) для поиска всех вхождений имени или типа переменной. Определение обычно достаточно очевидно.
  3. В Vim вы можете просто выполнять поиск в обратном направлении и часто находить то, что ищете.
person Steve Rowe    schedule 18.02.2009

Grep для общих шаблонов для объявлений переменных. Пример: *, &, > или буквенно-цифровой символ, за которым следует один или несколько пробельных символов, а затем имя переменной. Или имя переменной, за которым следует ноль или более пробельных символов, затем левая скобка или точка с запятой. Если он не был определен при действительно странных обстоятельствах (например, с помощью какого-то макроса), он работает каждый раз.

person Michel    schedule 18.02.2009
comment
Да, обычно я так делаю, но я искал что-то более профессиональное. - person Eduardo; 18.02.2009
comment
Вы всегда можете переопределить переменную и дождаться ошибки компиляции, которая сообщит вам, где было предыдущее объявление. Что-нибудь более профессиональное, вероятно, будет просто использовать IDE. - person Michel; 18.02.2009

В VIM вы можете использовать gd для просмотра объявлений локальных переменных или gD для просмотра объявлений глобальных переменных, если они определены в текущем файле. Ссылка Go_to_definition_using_g

Вы также можете использовать [i, чтобы увидеть определение, не переходя к нему, или [I, чтобы увидеть все вхождения переменной во всех включенных файлах, что, естественно, также покажет определение.

person Nathan Fellman    schedule 18.02.2009

Если вы работаете в Microsoft Visual Studio (которую, я думаю, вы могли бы использовать и для C++, но для этого потребуется работа на рабочей станции Windows), есть легкодоступная опция контекстного меню «Перейти к определению...», которая займет вы к определению любой в настоящее время отмеченной переменной, типа или метода.

person Tomas Aschan    schedule 18.02.2009
comment
В вопросе я не указываю графические интерфейсы, потому что работаю в текстовом режиме. - person Eduardo; 18.02.2009
comment
Не говоря уже о том, что вы пропустили слово: может быть. Я не нашел это как минимум надежным. Иногда это работает, а иногда нет. - person David Thornley; 19.02.2009

если вы настаиваете на том, чтобы оставаться в текстовом режиме, вы можете сделать это с помощью emacs или vi с соответствующими подключаемыми модулями.

А на самом деле, переместитесь в 21 век.

РЕДАКТИРОВАТЬ: Вы отметили, что делаете это через SSH, потому что вам нужна скорость сборки кластера удаленных серверов.

В этом случае смонтируйте диск на локальном компьютере и используйте IDE, а затем просто подключитесь по SSH, чтобы начать сборку.

person FlySwat    schedule 18.02.2009
comment
Установка диска на локальную машину иногда невозможна. Я часто работаю из дома, и мне приходится использовать SSH, потому что наш системный администратор не позволяет людям монтировать диски извне. Так что я тоже использую emacs. - person Frank; 18.02.2009
comment
Можете ли вы настроить удаленное X-соединение, туннелируемое через ssh? - person Mr Fooz; 18.02.2009
comment
@Mr Fooz, если вы спрашиваете меня, без понятия, также я не хочу иметь проблемы с администратором, у меня с ним не очень хорошие отношения. - person Eduardo; 18.02.2009
comment
Имейте в виду, что компиляция может включать передачу большого количества данных, что часто лучше всего делать на локальной машине, а не шифровать по каналу связи с неопределенной скоростью. - person David Thornley; 19.02.2009