2017-03-24 60 views
0

我已經使用Eclipse IDE幾年了。當用C編程時,我用Ctrl +單擊一個符號,Eclipse將我帶到符號聲明的文件和行。如何在沒有IDE的情況下查找聲明/定義?

沒有IDE,我該如何做到這一點?我正在使用gcc編譯一個擁有數百個頭文件的大型FOSS項目。通過查看C文件,我看到了我想知道的更多功能。查找聲明所述函數的頭文件是一項繁瑣且手動的任務。更不用說手動解釋宏...

GCC編譯項目,並知道什麼是聲明和在哪裏。是否有可能爲給定的編譯生成所有符號聲明及其文件名和位置的可讀索引?

+0

[Ctags](https://en.wikipedia.org/wiki/Ctags),[CScope](http://cscope.sourceforge.net/) –

+0

你現在在用什麼來「查看C文件...「? –

+0

@terencehill輕量級文本編輯器,納米,gedit,等。 –

回答

1

聽起來你正在尋找-aux-info旗;它會將在翻譯單元中聲明或定義的所有函數(包括頭文件中的函數)寫入指定的輸出文件。

這裏是一個愚蠢的一段代碼,我寫了另一個SO問題(不記得這是什麼的):

#include <stdio.h> 

int main(int argc, const char *argv[]) 
{ 
    const unsigned long long lim = 2000000; 
    unsigned long long nums2lim[lim]; 

    printf("%zu\n", sizeof nums2lim); 
    return 0; 
} 

gcc -o test -std=c99 -pedantic -Wall -Werror -aux-info=test.aux test.c 

編譯它產生在test.aux這樣的輸出:

/* compiled from: . */ 
/* /usr/include/libio.h:413:NC */ extern int __underflow (_IO_FILE *); 
/* /usr/include/libio.h:414:NC */ extern int __uflow (_IO_FILE *); 
/* /usr/include/libio.h:415:NC */ extern int __overflow (_IO_FILE *, int); 
/* /usr/include/libio.h:416:NC */ extern wint_t __wunderflow (_IO_FILE *); 
/* /usr/include/libio.h:417:NC */ extern wint_t __wuflow (_IO_FILE *); 
/* /usr/include/libio.h:418:NC */ extern wint_t __woverflow (_IO_FILE *, wint_t); 
/* /usr/include/libio.h:451:NC */ extern int _IO_getc (_IO_FILE *); 
/* /usr/include/libio.h:452:NC */ extern int _IO_putc (int, _IO_FILE *); 
/* /usr/include/libio.h:453:NC */ extern int _IO_feof (_IO_FILE *); 
/* /usr/include/libio.h:454:NC */ extern int _IO_ferror (_IO_FILE *); 
/* /usr/include/libio.h:456:NC */ extern int _IO_peekc_locked (_IO_FILE *); 
/* /usr/include/libio.h:462:NC */ extern void _IO_flockfile (_IO_FILE *); 
/* /usr/include/libio.h:463:NC */ extern void _IO_funlockfile (_IO_FILE *); 
/* /usr/include/libio.h:464:NC */ extern int _IO_ftrylockfile (_IO_FILE *); 
/* /usr/include/libio.h:482:NC */ extern int _IO_vfscanf (_IO_FILE *, const char *, __va_list_tag *, int *); 
/* /usr/include/libio.h:484:NC */ extern int _IO_vfprintf (_IO_FILE *, const char *, __va_list_tag *); 
/* /usr/include/libio.h:485:NC */ extern __ssize_t _IO_padn (_IO_FILE *, int, __ssize_t); 
/* /usr/include/libio.h:486:NC */ extern size_t _IO_sgetn (_IO_FILE *, void *, size_t); 
/* /usr/include/libio.h:488:NC */ extern __off64_t _IO_seekoff (_IO_FILE *, __off64_t, int, int); 
/* /usr/include/libio.h:489:NC */ extern __off64_t _IO_seekpos (_IO_FILE *, __off64_t, int); 
/* /usr/include/libio.h:491:NC */ extern void _IO_free_backup_area (_IO_FILE *); 
/* /usr/include/stdio.h:154:NC */ extern int remove (const char *); 
/* /usr/include/stdio.h:156:NC */ extern int rename (const char *, const char *); 
/* /usr/include/stdio.h:171:NC */ extern FILE *tmpfile (void); 
/* /usr/include/stdio.h:185:NC */ extern char *tmpnam (char *); 
/* /usr/include/stdio.h:213:NC */ extern int fclose (FILE *); 
/* /usr/include/stdio.h:218:NC */ extern int fflush (FILE *); 
/* /usr/include/stdio.h:249:NC */ extern FILE *fopen (const char *, const char *); 
/* /usr/include/stdio.h:256:NC */ extern FILE *freopen (const char *, const char *, FILE *); 
/* /usr/include/stdio.h:309:NC */ extern void setbuf (FILE *, char *); 
/* /usr/include/stdio.h:314:NC */ extern int setvbuf (FILE *, char *, int, size_t); 
/* /usr/include/stdio.h:334:NC */ extern int fprintf (FILE *, const char *, ...); 
/* /usr/include/stdio.h:339:NC */ extern int printf (const char *, ...); 
/* /usr/include/stdio.h:342:NC */ extern int sprintf (char *, const char *, ...); 
/* /usr/include/stdio.h:349:NC */ extern int vfprintf (FILE *, const char *, __va_list_tag *); 
/* /usr/include/stdio.h:354:NC */ extern int vprintf (const char *, __va_list_tag *); 
/* /usr/include/stdio.h:357:NC */ extern int vsprintf (char *, const char *, __va_list_tag *); 
/* /usr/include/stdio.h:365:NC */ extern int snprintf (char *, size_t, const char *, ...); 
/* /usr/include/stdio.h:369:NC */ extern int vsnprintf (char *, size_t, const char *, __va_list_tag *); 
/* /usr/include/stdio.h:406:NC */ extern int fscanf (FILE *, const char *, ...); 
/* /usr/include/stdio.h:411:NC */ extern int scanf (const char *, ...); 
/* /usr/include/stdio.h:414:NC */ extern int sscanf (const char *, const char *, ...); 
/* /usr/include/stdio.h:425:NC */ extern int vfscanf (FILE *, const char *, __va_list_tag *); 
/* /usr/include/stdio.h:432:NC */ extern int vscanf (const char *, __va_list_tag *); 
/* /usr/include/stdio.h:437:NC */ extern int vsscanf (const char *, const char *, __va_list_tag *); 
/* /usr/include/stdio.h:447:NC */ extern int fgetc (FILE *); 
/* /usr/include/stdio.h:448:NC */ extern int getc (FILE *); 
/* /usr/include/stdio.h:454:NC */ extern int getchar (void); 
/* /usr/include/stdio.h:489:NC */ extern int fputc (int, FILE *); 
/* /usr/include/stdio.h:490:NC */ extern int putc (int, FILE *); 
/* /usr/include/stdio.h:496:NC */ extern int putchar (int); 
/* /usr/include/stdio.h:539:NC */ extern char *fgets (char *, int, FILE *); 
/* /usr/include/stdio.h:546:NC */ extern char *gets (char *); 
/* /usr/include/stdio.h:596:NC */ extern int fputs (const char *, FILE *); 
/* /usr/include/stdio.h:602:NC */ extern int puts (const char *); 
/* /usr/include/stdio.h:609:NC */ extern int ungetc (int, FILE *); 
/* /usr/include/stdio.h:617:NC */ extern size_t fread (void *, size_t, size_t, FILE *); 
/* /usr/include/stdio.h:623:NC */ extern size_t fwrite (const void *, size_t, size_t, FILE *); 
/* /usr/include/stdio.h:656:NC */ extern int fseek (FILE *, long int, int); 
/* /usr/include/stdio.h:661:NC */ extern long int ftell (FILE *); 
/* /usr/include/stdio.h:666:NC */ extern void rewind (FILE *); 
/* /usr/include/stdio.h:705:NC */ extern int fgetpos (FILE *, fpos_t *); 
/* /usr/include/stdio.h:710:NC */ extern int fsetpos (FILE *, const fpos_t *); 
/* /usr/include/stdio.h:733:NC */ extern void clearerr (FILE *); 
/* /usr/include/stdio.h:735:NC */ extern int feof (FILE *); 
/* /usr/include/stdio.h:737:NC */ extern int ferror (FILE *); 
/* /usr/include/stdio.h:753:NC */ extern void perror (const char *); 
/* test.c:4:NF */ extern int main (int argc, const char **argv); /* (argc, argv) int argc; const char **argv; */ 

此標誌只適用於C代碼,但它不會給你C++的任何東西。

+0

如果有一個比「我正在尋找的東西」更精確的短語,我會使用它。 –

+0

奇怪的是,g ++沒有相應的東西......無論C是什麼,它再一次佔上風。 –

1

一個輕量級的黑客辦法是grep通過頭文件的函數名稱。 Linux的語法將是這樣的:

find . -type f -name "*.h" | xargs grep [functionName]

這是我用我的中等規模的項目。我不能說它會如何擴大規模。

相關問題