2017-03-24 123 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]

这是我用我的中等规模的项目。我不能说它会如何扩大规模。

相关问题