2012-04-22 50 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)以外的地方使用的函數的聲明。