- c/
- C 源文件中的代码排序-转发声明与;Don';不要重复你自己的话;?
C 源文件中的代码排序-转发声明与;Don';不要重复你自己的话;?
C 源文件中的代码排序-转发声明与;Don';不要重复你自己的话;?,c,coding-style,C,Coding Style,如果您使用C编写代码,并将编译器配置为在使用所有函数之前声明它们(或者如果您使用C++编写代码),那么您的源文件最终可以使用(至少)两个组织中的一个
要么:
标题
转发此文件中(静态)函数的声明
外部功能(主要入口点)
静态-非公共-函数
或:
标题
静态-非公共-函数
外部功能(主要入口点)
我认识到C++中,“static”这个词不是首选,但我主要是C程序员,C++中有等价的概念,即文件中的匿名命名空间中的函数。
问题:
您使用哪种组织,为什么您更喜欢它
作为参考,我自己的代码使
如果您使用C编写代码,并将编译器配置为在使用所有函数之前声明它们(或者如果您使用C++编写代码),那么您的源文件最终可以使用(至少)两个组织中的一个
要么:
- 标题
- 转发此文件中(静态)函数的声明
- 外部功能(主要入口点)
- 静态-非公共-函数
或:
<>我认识到C++中,“static”这个词不是首选,但我主要是C程序员,C++中有等价的概念,即文件中的匿名命名空间中的函数。
问题:
作为参考,我自己的代码使用了第二种格式,这样静态函数在使用之前就已经定义好了,这样就不需要同时声明和定义它们,这样就节省了关于函数接口的信息写两次的时间,这反过来又减少了(略微减少了)内部接口需要更改时的开销。这样做的缺点是,文件中定义的第一个函数是最低级别的例程——这些例程是由文件中稍后定义的函数调用的——因此,它不是将最重要的代码放在顶部,而是更接近文件的底部。这对你有多重要
我假设所有外部可访问的函数都是在头文件中声明的,并且这种形式的重复是必要的——我认为这不应该引起争议。对我来说是第二位
我认为使用静态或其他方法将模块函数和变量私有化到模块是一种很好的做法
我更喜欢将api函数放在模块的底部。相反,我将api函数放在类的顶部,因为类通常是可重用的。将api函数放在顶部可以更容易地快速找到它们。大多数IDE可以非常直接地将您带到任何函数。我一直使用方法#1,原因是我希望能够快速判断特定文件中定义了哪些函数,并在一个位置查看它们的签名。我不认为必须随函数定义一起更改原型的论点特别有说服力,因为不管怎样,您通常都会更改调用已更改函数的所有代码,而在执行时更改函数原型似乎相对简单。(谈论C代码)
第二,因为我总是忘记更新forward decls来反映静态函数的变化
但我认为最好的做法应该是
- 标题
- 转发声明+对每个声明的函数行为进行注释
- 当代码不够清晰时,导出的函数+关于实现细节的最终注释
- 静态函数+关于实现细节的最终注释
第二点:因为我编写了许多短函数并自由地重构它们,所以维护转发声明会非常麻烦。如果有一个Emacs扩展可以毫不费事地为您做到这一点,我会感兴趣,因为自上而下的组织更具可读性。(我更喜欢自上而下的方式,例如Python。)
实际上不完全是你的第二个,因为我通常在.c中将相关函数分组在一起,不管它们是公共的还是私有的。如果我想查看所有公共声明,我将查看标题。在C代码中,我使用一个简单的规则:
- 每个具有非静态成员的C文件都将有一个相应的头文件来定义这些成员
这在过去对我来说非常有效——这使得查找函数的定义变得非常容易,因为如果我需要查找它,它位于同一个命名的.h文件中。它也适用于doxygen(我的首选工具),因为所有的积垢都保存在头文件中,我不会在头文件中花费大部分时间——C文件中充满了代码
对于文件中的静态成员,我坚持对声明进行排序,以便在使用之前通过实例化来定义声明。而且,我几乎总是避免函数调用中的循环依赖
< C++代码>我尝试如下:
- 头文件中定义的所有代码。使用#pragma接口/#pragma实现通知编译器;类似于模板将所有代码放在头中的方式
<>这在C++中对我来说很好。这意味着您最终会得到巨大的头文件,这在某些情况下会增加编译时间。最后,您还可以使用一个C++主体文件,其中只包含头并编译。您可以在这里实例化静态成员变量。这也成为了一场噩梦,因为更改方法参数和破坏代码太容易了
我搬到了
- 包含doxygen注释的头文件(模板除外,其中代码必须包含在头文件中)和完整的主体文件,但我知道我更喜欢在使用时内联的简短方法除外
将实现从定义中分离出来有一个明显的优点,即更难更改方法/函数签名,因此您不太可能这样做并破坏它。这也意味着我可以在头文件中有巨大的doxygen块来记录事情是如何工作的,并且在代码中的工作相对没有中断,除了有用的注释,比如“声明一个名为I的变量”(开玩笑地说)
Ada强制您遵守约定和文件命名方案。大多数动态语言,如Ruby、Python等,通常不关心在何处/是否声明内容
这对你有多重要
不是
重要的是,所有本地功能都将标记为