Как найти определение структуры при чтении c программы на linux? - PullRequest
7 голосов
/ 17 февраля 2012

Я читаю исходный код xl2tpd и сталкиваюсь с множеством проблем при чтении этого кода.Например, я не могу найти, где определена структура lac.Как мне найти определение этой структуры?

Я использовал ctags и vim для чтения этого кода, но не смог найти структуру.Я погуглил и не смог найти структуру.Есть ли способ, который может сделать процесс чтения кода более удобным?То есть я могу перейти к определению большинства переменных, функций и структур?

Ответы [ 5 ]

9 голосов
/ 17 февраля 2012

попробуй cscope с vim. следуйте инструкциям ниже -
1) запустите cscope -R в каталоге xl2tpd. это создаст файл cscope.out
2) открыть файл с vim, где используется структура lac
3) использовать :cs f g <lac>. теперь он покажет файлы, где определено lac.
4) выберите file.h. оно содержит определение.
если вы особенно заинтересованы в определении структуры lac, то она ниже -

struct lac
{
    struct lac *next;
    struct host *lns;           /* LNS's we can connect to */
    struct schedule_entry *rsched;
    int tun_rws;                /* Receive window size (tunnel) */
    int call_rws;               /* Call rws */
    int rxspeed;                /* Tunnel rx speed */
    int txspeed;                /* Tunnel tx speed */
    int active;                 /* Is this connection in active use? */
    int hbit;                   /* Permit hidden AVP's? */
    int lbit;                   /* Use the length field? */
    int challenge;              /* Challenge authenticate the peer? */
    unsigned int localaddr;     /* Local IP address */    
    unsigned int remoteaddr;    /* Force remote address to this */
    char authname[STRLEN];      /* Who we authenticate as */
    char password[STRLEN];      /* Password to authenticate with */
    char peername[STRLEN];      /* Force peer name to this */
    char hostname[STRLEN];      /* Hostname to report */
    char entname[STRLEN];       /* Name of this entry */
    int authpeer;               /* Authenticate our peer? */
    int authself;               /* Authenticate ourselves? */
    int pap_require;            /* Require PAP auth for PPP */
    int chap_require;           /* Require CHAP auth for PPP */
    int pap_refuse;             /* Refuse PAP authentication for us */
    int chap_refuse;            /* Refuse CHAP authentication for us */
    int idle;                   /* Idle timeout in seconds */
    int autodial;               /* Try to dial immediately? */
    int defaultroute;           /* Use as default route? */
    int redial;                 /* Redial if disconnected */
    int rmax;                   /* Maximum # of consecutive redials */
    int rtries;                 /* # of tries so far */
    int rtimeout;               /* Redial every this many # of seconds */
    char pppoptfile[STRLEN];    /* File containing PPP options */
    int debug;
    struct tunnel *t;           /* Our tunnel */
    struct call *c;             /* Our call */
};
2 голосов
/ 17 февраля 2012

При просмотре стороннего кода есть несколько инструментов, которые я считаю бесценными:

Я полагаю, что Eclipse CDT также позволяет вам быстро найти определение любой переменной, которую вы просматриваете, но я на самом деле ее не использовал - я предпочитаю использовать консольные программы для моего фактического C-кода.

Ни один из них не основан на vim, хотя по крайней мере ctags можно использовать через vim или emacs. Тем не менее, они могут быть очень полезны при изучении новой кодовой базы, о которой вы ничего не знаете ...

1 голос
/ 17 февраля 2012

Вы говорите о этом ?

Исходный код уже поставляется с tags файлом.

Загружая любой файл (common.h в моем случае) в Vim, вы можете использовать :tag lac для перехода к первому определению lac или :tselect lac для выбора между 3 вхождениями в этом проекте и :tag gconfig для перейти к уникальному определению gconfig.

См. :help tags.

0 голосов
/ 29 мая 2018

Я использую vim + cscope и имею ту же проблему с вами.Я нахожу способ обойти эту проблему.

в vim, ищите текст вместо определения.например, в исходном коде ядра Linux, если вы пытаетесь найти «struct file», введите команду:

cs find t struct file {

, у вас будет точное определение своевременнов большинстве случаев будьте осторожны, без кавычек для текста "struct file {".

надеюсь, это поможет вам.

0 голосов
/ 28 января 2018

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

...