Как найти использование элемента структуры с помощью cscope и игнорировать локальные переменные?

#c #vim #cscope

#c #vim #cscope

Вопрос:

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

Предположим, у меня есть что-то вроде этого:

   1 typedef struct _s{
  2     
  3     int x;
  4 } S;
  5  
  6 int main(){
  7
  8     int x = 1;
  9
 10     S my_s;
 11
 12     my_s.x = 5;
 13
 14     return my_s.x;
 15 }
  

Если я введу команду ‘cs f s x’, она вернет как переменную-член S, так и локальную основную переменную. Есть ли способ, которым я могу найти только вхождения переменной-члена S?

Комментарии:

1. Не могли бы вы просто выполнить текстовый поиск по «.x» ?

2. @ChrisLutz Могут быть другие, не связанные структуры, в которых также есть вызываемый элемент x .

Ответ №1:

Я не думаю, что есть какой-либо способ заставить cscope различать локальную переменную x и переменную-член структуры.

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

 typedef struct _s{    
    int s_x;
} S;
  

Поначалу это немного неудобно, но как только вы к этому привыкнете, вам станет легче ориентироваться в коде. Обычно uniquifier — это всего лишь несколько символов, относящихся к структуре, и это не слишком сильно все загромождает.

Комментарии:

1. Спасибо за ответ. В моем случае это не сработает, потому что я только что унаследовал большую базу кода, где они не следуют этому руководству. Однако я буду иметь это в виду. Я спросил, потому что многие IDE, такие как Eclipse и VS, могут это делать. Очевидно, что vim не является IDE, но я подумал, может ли он немного расширить эту функциональность.

2. Это прискорбно. Если вы найдете способ сделать это, я был бы рад это услышать!

Ответ №2:

Вместо поиска x вы можете поместить курсор на структурную переменную «my_s», а затем нажать комбинацию клавиш «gd». Это поможет вам найти определение my_s, а затем использовать cscope для поиска определения S.

Комментарии:

1. Я боюсь, что вопрос гласит ...struct member uses... , а не определения?

2. Да, я пытался получить все варианты использования переменной-члена ‘x’ по всему коду, а не там, где она была определена.