![](/img/trans.png)
[英]C++ function prototype declared in class definition in .h file but function not defined in .cpp
[英]The function extension in C++ definition file (CPP)
在C ++定義文件(.cpp)中,有時我可以定義要調用的小函數,例如:
// Class declaration
// Myclass.h
Class Myclass
{
...
void Classfunction();
...
}
// Class defination
// Myclass.cpp
#include "Myclass.h"
...
void helper_fun()
{
...
}
...
void Myclass::Classfunction()
{
...
helper_fun();
...
}
在上面的示例中,我們可以看到在.cpp文件中聲明並定義了無效的helper_fun()。 該功能的目的是由該類中已定義的功能調用的。 當然,可以先在頭文件中聲明helper_fun,然后在實現文件中對其進行定義。 我的問題是,這是否是C ++代碼編寫的良好實踐。 此外,這種做法是否會帶來不良影響? 謝謝!
最好在源文件的匿名名稱空間中定義helper_fun
。
像這樣:
namespace {
void helper_fun()
{
//...
}
}
原因是,如果在另一個具有相同簽名的源文件中定義了另一個helper_fun
,則不會有鏈接錯誤的風險。 並不是說會有一個,而是可能會有一個。
另外,如果函數不會在相應的源文件之外使用,則不應將函數放在標頭中。
在源文件中具有本地幫助器功能非常普遍。 通常,它們要么聲明為static
(例如, static void helper_fun() { }
),要么在匿名命名空間中聲明(例如, namespace { void helper_fun() { } }
)。
使這些函數靜態化或將它們放在匿名名稱空間中是為了使它們不會從外部被調用,從而使您可以擁有更多具有相同名稱的本地函數。
但是,如果要從其他源文件中調用該函數,則請正常定義該函數,然后在頭文件中添加一個聲明。
如果需要將其公開,並通過頭文件包含在其他文件中。 然后放到那里。
否則,沒有理由將其放在標題中。
如果在標頭中聲明helper_fun
,則Myclass.h
用戶可以看到它。 您是否要在其他地方使用helper_fun
?
通過僅將其保留在Myclass.cpp
可以確保只能由Myclass.cpp
的代碼使用它。
當然,在.cpp文件中聲明函數是可以的。 它是輔助函數,因此,不應將其聲明提供給用戶。 您可以將匿名名稱空間用於內部鏈接(默認情況下,函數具有外部鏈接)。
未命名的名稱空間或在未命名的名稱空間中直接或間接聲明的名稱空間具有內部鏈接。
像這樣
namespace
{
// helper_fun has internal linkage.
void helper_fun()
{
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.