如果这听起来有点愚蠢,我真的很抱歉。我刚刚读完K& R并参与了一些练习。今年夏天,对于我的项目,我正在考虑重新实现一个linux实用程序,以进一步扩展我对C的理解,所以我下载了GNU tar和sed的源代码,因为它们看起来都很有趣。但是,我无法理解它的起始位置,主要实现的位置,所有奇怪的宏来自哪里等等。
我有很多时间,所以这不是一个真正的问题。我是否应该首先熟悉GNU工具链(即make,binutils,..)才能理解程序?或许我应该从稍微小一些的东西开始(如果有这样的事情)?
如果重要的话,我对Java,C ++和python有一点经验。
谢谢!
答案 0 :(得分:14)
GNU程序大而复杂。 GNU Hello World的大小表明即使是最简单的GNU项目也需要大量的代码和配置。
对于初学者来说,autotools很难理解,但是你不需要理解它们来阅读代码。即使你修改代码,大多数时候你只需运行make来编译你的更改。
要阅读代码,您需要一个好的编辑器(VIM,Emacs)或IDE(Eclipse)以及一些工具来浏览源代码。 tar项目包含一个src目录,这是一个很好的起点。程序总是从main函数开始,所以
grep main *.c
或使用您的IDE搜索此功能。它在tar.c中。现在,跳过所有初始化的东西,直到
/* Main command execution. */
在那里,您可以看到子命令的开关。如果你传递-x它会这样做,如果你传递-c它会这样做,等等。这是这些命令的分支结构。如果您想知道这些宏是什么,请运行
grep EXTRACT_SUBCOMMAND *.h
你可以看到它们列在common.h中。
在EXTRACT_SUBCOMMAND下面你会看到一些有趣的东西:
read_and (extract_archive);
read_and()的定义(再次使用grep获得):
read_and (void (*do_something) (void))
单个参数是一个函数指针,就像一个回调,所以read_and应该读取一些东西,然后调用函数extract_archive
。再次,grep就可以了,你会看到:
if (prepare_to_extract (current_stat_info.file_name, typeflag, &fun))
{
if (fun && (*fun) (current_stat_info.file_name, typeflag)
&& backup_option)
undo_last_backup ();
}
else
skip_member ();
请注意,调用fun
时会发生实际工作。 fun
也是一个函数指针,在prepare_to_extract中设置。 fun
可能指向实际写作的extract_file
。
我希望我能通过这个方式为您提供很多帮助,并向您展示我如何浏览源代码。如果您有相关问题,请随时与我联系。
答案 1 :(得分:7)
tar
和sed
等程序的问题是双重的(当然这只是我的观点!)。首先,他们都非常旧。这意味着他们多年来一直有多人维护它们,具有不同的编码风格和不同的个性。对于GNU实用程序,它通常非常好,因为它们通常强制执行合理一致的编码风格,但它仍然是一个问题。另一个问题是它们难以置信地便携式。通常,“可移植性”被认为是一件好事,但是当它走向极端时,这意味着你的代码库最终会充满一些小技巧和窍门来处理特定硬件和系统中的模糊错误和角落案例。对于广泛移植到tar
和sed
的程序,这意味着需要考虑角落案例和模糊硬件/编译器/操作系统的批次。
如果你想学习C,那么我想说最好的起点就是不去学习其他人编写的代码。相反,尝试自己编写代码。如果您真的想从现有代码库开始,请选择一个正在积极维护的代码库,您可以在其中看到其他人正在制作的所做的更改,在邮件列表和等等。
使用完善的程序,例如tar
和sed
,您会看到会发生的讨论的结果,但您无法看到软件设计的方式决策和变更正在实时进行。这只能通过积极维护的软件来实现。
当然,这只是我的意见,如果你愿意的话,你可以把它当作一粒盐:)
答案 2 :(得分:5)
为什么不下载coreutils的来源(http://ftp.gnu.org/gnu/coreutils/)并查看yes
等工具?少于100行的C代码和一个功能齐全,实用且非常基本的GNU软件。
答案 3 :(得分:4)
GNU Hello可能是最小,最简单的GNU程序,并且易于理解。
答案 4 :(得分:1)
我知道有时导航C代码很麻烦,特别是如果你不熟悉它。我建议您使用tool来帮助您浏览函数,符号,宏等。然后查找main()函数。
当然,您需要熟悉这些工具,但您不需要成为专家。
答案 5 :(得分:1)
如果您还不知道如何使用 grep ,请使用它来搜索 main 功能以及您感兴趣的所有其他内容。您可能还想使用代码浏览工具,例如ctags或cscope,它们也可以与vim和emacs集成,或者如果你更喜欢那样使用IDE。
答案 6 :(得分:0)
答案 7 :(得分:0)
理解一些使用大量宏,实用函数等的代码可能很难。为了更好地浏览随机C或C ++软件的代码,我建议使用这种方法,这是我通常使用的方法:
安装Qt开发工具和Qt Creator
下载您要检查的来源,并将其设置为进行编译(对于GNU内容通常只需./configure
)。
在源目录的根目录中运行qmake -project
,为Qt Creator生成Qt .pro
文件。
在Qt Creator中打开.pro
文件(请勿使用阴影版本)。
为了安全起见,在Qt Creator Projects视图中,删除默认的构建步骤。 .pro
文件仅用于在Qt Creator中导航。
可选:如果要在Qt Creator下构建和运行/调试,请设置自定义构建和运行步骤。仅用于导航不需要。
使用Qt Creator浏览代码。特别注意定位器(kb快捷键Ctrl + K)按名称查找东西,“跟踪光标下的符号”(kb快捷键F2)和“查找用法”(kb快捷键Ctrl-Shift-U)。
< / LI> 醇>