the*_*eck 56 c++ header header-files
有没有办法不必编写两次函数声明(头文件),并且在编译时仍然保持相同的可伸缩性,调试的清晰度和在C++中编程时的设计灵活性?
rix*_*rrr 37
当我开始写C时,我也有同感,所以我也研究了这个.答案是,是的,有可能,不,你不想.
首先是的.
在GCC中,您可以这样做:
// foo.cph
void foo();
#if __INCLUDE_LEVEL__ == 0
void foo() {
printf("Hello World!\n");
}
#endif
Run Code Online (Sandbox Code Playgroud)
这具有预期的效果:您将标题和源都合并到一个文件中,该文件既可以包含也可以链接.
然后是否:
这仅在编译器可以访问整个源时才有效.在编写要分发但保持闭源的库时,不能使用此技巧.您要么分发完整的.cph文件,要么必须编写一个单独的.h文件来与.lib一起使用.虽然也许您可以使用宏预处理器自动生成它.但它会变得毛茸茸.
理由#2为什么你不想要这个,这可能是最好的一个:编译速度.通常,只有在文件本身发生更改或其包含的任何文件发生更改时,才需要重新编译C源文件.
当所有文件都是头文件和源文件的组合时,每次更改都会触发重新编译所有源文件.C++现在还不知道它的快速编译时间,想象一下每次必须重新编译整个项目时会发生什么.然后将其推断为具有复杂依赖性的数百个源文件的项目......
ojr*_*rac 27
对不起,但是没有用于消除C++标题的"最佳实践":这是一个坏主意,期间.如果你恨他们那么多,你有三个选择:
Dan*_*nas 10
Pedro Guerreiro 在他的文章" 简单支持C++合同设计"中说:
通常,C++类有两个文件:头文件和定义文件.我们应该在哪里编写断言:在头文件中,因为断言是规范的?或者在定义文件中,因为它们是可执行的?或两者兼而有之,冒着不一致的风险(和重复工作)?我们建议,相反,我们抛弃了传统的风格,并废除定义文件,仅使用头文件,好像所有职能联定义,非常像Java和艾菲尔做.
这是C++正常性的一个巨大变化,它可能会在一开始就扼杀这一努力.另一方面,为每个类维护两个文件是如此尴尬,迟早会出现一个隐藏C++开发环境的环境,让我们专注于我们的课程,而不必担心它们的存储位置.
那是2001年.我同意了.现在是2009年,现在仍然没有"隐藏我们的开发环境,让我们专注于我们的课程".相反,长编译时间是常态.
注意:上面的链接现在似乎已经死了.这是对该出版物的完整参考,因为它出现在作者网站的出版物部分:
Pedro Guerreiro,简单支持C++合同设计,TOOLS USA 2001,Proceedings,24-34页,IEEE,2001.
没有实用的方法来绕过标题.您唯一能做的就是将所有代码放入一个大的c ++文件中.这将最终陷入难以控制的混乱,所以请不要这样做.
目前C++头文件是一个非常邪恶的东西.我不喜欢他们,但没有办法解决他们.我很乐意看到有关这个问题的一些改进和新想法.
顺便说一句 - 一旦你习惯了它就不再那么糟了.. C++(以及任何其他语言)都有更多令人讨厌的东西.
你必须写两次函数声明,实际上(一次在头文件中,一次在实现文件中).函数的定义(AKA实现)将在实现文件中写入一次.
您可以在头文件中编写所有代码(它实际上是C++中通用编程中非常常用的实践),但这意味着包含该头的每个C/CPP文件都意味着从这些头文件重新编译实现.
如果您正在考虑使用类似于C#或Java的系统,那么在C++中是不可能的.
| 归档时间: |
|
| 查看次数: |
36556 次 |
| 最近记录: |