2012-04-22 100 views
1

假设我有以下文件:C++风格的头文件

  1. 的main.cpp
  2. routine.cpp
  3. routine.h

进一步假设main.cpp中调用函数routine(),该函数在routine.cpp中定义,但例程.cpp还包含routine()函数使用的只有的函数。换句话说,routine.cpp包含这两个函数,这些函数只能在routine.cpp中调用,而函数是从其他源文件调用的。

显然main.cpp将包含#include "routine.h"。但是,如果routine.h包含例程.cpp(样式A)中定义的所有函数的原型,或者应该例程.h只包含包含从其他源文件(样式B)调用的函数原型?

我总是在样式A之后编写代码,但最近我想知道样式B是否更具风格。 (如果使用样式B,那么仅在routine.cpp中使用的函数的原型可能位于例程.cpp的顶部,或者定义可能仅在它们的使用之前)。

+1

每个帖子有一个问题。另外,第二个问题很可能会被视为“不具有建设性”。 – 2012-04-22 17:48:23

+0

@CatPlusPlus:对不起,收到消息。 – synaptik 2012-04-22 18:16:34

回答

7

通常,仅头包含公共接口的方法(如果这些是自由函数)。您可以在匿名命名空间中声明routine.cpp中使用的辅助方法。

//routine.h 

void foo(); 
void goo(); 

//routine.cpp 

namespace 
{ 
    void fooHelper() {} 
    void gooHelper() {} 
} 

void foo() 
{ 
    fooHelper(); 
} 
void goo() 
{ 
    gooHelper(); 
} 

这些功能以前宣布static,这给了他们内部的联动,但总的风格是现在使用匿名的命名空间。

+0

那么在routine.cpp中的“匿名命名空间”中放置'fooHelper(){}'和'gooHelper(){}'会产生什么影响? – synaptik 2012-04-22 18:15:19

+0

@synaptik你不能使用该翻译单元以外的功能。 – 2012-04-22 18:18:56

0

谷歌的风格指南非常全面。它为他们的选择提供了优点/缺点和理由。 http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml

+8

Google风格指南适用于旧版Google项目,并且*不是*现代C++风格指南。 – 2012-04-22 17:49:50

+0

也许与您的OP最相关:http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#The__define_Guard – Scottymac 2012-04-22 17:50:03

+1

@CatPlusPlus感谢您提供了一个相对无益的评论......在您看来,他们的指南并不是一件好事“现代”C++指南。然而,它实际上是相当不错的,至少他们花时间创造了一个完整的现实。也许通过提供替代方案,你可能会做出积极的贡献。作为Stack的新成员,以及一位非常具有商业经验的程序员,我并不完全明白表示欢迎意见。 – Scottymac 2012-04-22 18:10:34

0

routine.h不应包含的那些不想要的routine.cpp(样式B)以外的地方使用的函数的声明。