2012-01-20 16 views
2

我正在從C遷移到C++,我注意到的第一件事情是在命名空間裏面的原型冗餘。我試圖利用命名空間的功能來保持我的添加/修改清楚標記。命名空間是否在C++中使原型設計方法過時了?

namespace ns { 
    void sayHello (void); //<-- NOT REQUIRED, BUT IS THERE ANY PURPOSE? 
    void sayHello (void) { 
     std::cout << "Hello world!"; 
     return; 
    } 
} 

int main(int argc, char *argv[]) { 
    ns::sayHello(); 
} 

此前,在C,這是很好的措施有原型的,所以你將不需要寫你的函數「上面」源代碼的main()。在我看來,命名空間必須在使用之前定義,因此,任何嵌套函數也將在使用之前寫入。

我剛剛啓動C++,我想開始正確。我一直在閱讀互聯網上的幾篇教程,但他們沒有真正提到這個話題。我知道這是「簡單」,但請不要讓我反對意見和評論。如果有人能夠做到,我希望能夠深入討論它是否已經過時,以及/或者這種情況最終會讓一個新的C++開發者感到痛苦。

回答

5

不一定。宣言和定義仍然是不同的概念。另請注意,名稱空間可以跨越多個文件,而且不需要定義在名稱空間中。在C++實現的

//test.h 
namespace test 
{ 
    void foo(); 
    //no implementation in header 
} 

//main.cpp 
int main() 
{ 
    test::foo(); 
    return 0; 
} 

//test.cpp 
namespace test 
{ 
    void foo() { }; 
    //definition here 
    //without the definition, we'd get a link error 
} 

分離是喜歡保持你的代碼的祕密,更快的編譯(改變頭中的定義將要求所有包括文件的重新編譯)原因而作出的,隱藏實現細節或淨化器結構。

0

如果你拆分頭文件和實現文件,那麼原型是必需的。

0

您將聲明放在頭文件中,並將源文件中的定義放入源文件中,如

例如, ns.h:

namespace ns { 
    void sayHello (void); 
} 

在ns.cc:

namespace ns { 
    void sayHello (void) { 
     std::cout << "Hello world!"; 
     return; 
    } 
} 

在main.cc:

#include "ns.h" 

int main(int argc, char *argv[]) { 
    ns::sayHello(); 
} 
0

我不知道如果我理解正確你的問題。也就是說,名稱空間並沒有改變函數的聲明/定義過程。命名空間的目的只是爲了讓編譯器能夠理解您所包含的文件中包含多個foo()的版本。

關於您所做的示例:如果您將定義放在聲明之後,則不再需要該聲明(定義也可以作爲聲明)。如果在頭文件和源文件中分割聲明和定義,則仍然需要原型。順便說一句,這是推薦的,因爲誰使用你的代碼只需要包含頭文件(告訴編譯器「應該如何調用你的函數」)。鏈接時只需要定義。

希望我解決了至少一點點你的問題...... ;-)

相關問題