![](/img/trans.png)
[英]How should I pass and return unsigned int by value from Java to C/C++ in jna
[英]Should I use “int” or “bool” as a return value in C++?
如果我有一個執行某些過程的函數然后需要返回某事的真值,那么使用布爾變量或int變量作為返回類型是否有令人信服的理由?
bool Foo()
{
...
...
return truthValue;
}
int Foo()
{
...
...
return truthValue;
}
這兩個功能之間有明顯的區別嗎? 這兩者有哪些潛在的缺陷和優勢?
謝謝,
NMR
如果它是一個真正的真值,那么你應該使用一個bool,因為它使調用者非常清楚將返回什么。 返回int時,可以將其視為代碼/枚舉類型值。
代碼應盡可能清晰明確,無論是函數名稱,參數名稱和類型,還是返回代碼的類型。 這提供了更多自我記錄的代碼,更易於維護的代碼,以及有人會誤解您“意味着什么”的可能性更低。
如果要返回二進制真值,則應使用布爾數據類型(如果可用)。
編譯器會在必要時對事物進行優化,您應該盡可能地編寫代碼以便清楚。 這樣,您或您的繼任者將毫無疑問地在軌道上走了五年。
使用bool
- 它更清楚地傳達了代碼的語義含義。 如果另一個開發人員讀取您的代碼並看到bool
的返回類型,他立即知道它返回一個真值。 相反,如果他看到它返回一個int
,他必須進一步挖掘並花費更多時間來確定函數的界面(例如閱讀文檔或閱讀代碼),這會減慢他的速度。
使用int
的唯一原因是,如果您需要與遺留代碼接口和/或符合特定接口(例如,您的函數獲取其地址並傳遞給需要某個原型函數的第三方庫)。
有一點在現有答案中沒有得到足夠的重視:肯定使用bool,但為了獲得最大的好處,你只需要為你的bool變量和函數使用好名字。 我提到這個是因為truthValue是一個典型的可怕名字。 您的bool名稱應始終使您使用的約定顯而易見。 不要讓其他編碼器猜測bool變量的工作方式。 所以;
好名字
bool okay;
bool error;
bool success;
bool IsWidget();
壞名字
bool truthValue;
bool status;
bool result;
bool Widget();
你看到了區別? 誠然,你的真理價值可能比狀態或結果更好。 但基本上壞名稱會使代碼混亂;
// Bad
bool result = Func();
if( result )
{
// Did Func() succeed or fail ? who knows
}
// Good
bool okay = Func();
if( okay )
{
// Func() succeeded
}
使用bool的最大優點是語義。 如果我看到一個返回bool的函數,我知道它只會返回true或false,甚至沒有查看或者過於強調函數的名稱。 如果它返回一個int,我必須更加思考並仔細觀察該函數。
當你在它的時候(使用bool作為返回值,也就是這樣),也可以用這樣的方式命名你的bool返回函數,這樣就可以明顯地將true和false表示為返回值。 想想危險:以問題的形式陳述您的功能名稱。
有幾點需要考慮。 如果Foo
可以從C調用,則不能返回bool
因為C不知道什么是bool
。
int
也可以返回true
或false
以外的值。 根據Foo
是否可以有其他有意義的返回值,這可能是好事還是壞事。 但是,如果可以,Foo返回enum
值而不是int
更有意義。
如果您沒有與C的兼容性作為要求,我會建議bool
。
bool過去只是一個宏...現在編譯器強制它只有0或1的值(除非它是未初始化的)。 我肯定會使用bool - 它是自我記錄的,除了bool之外你不需要任何東西。 保持簡單,具體。
如果truthValue是bool return bool。
這可以防止類型的錯誤(沒有大問題)。
另一個原因是傳統的是返回一個int來報告狀態,其中0表示成功,非零數字表示錯誤情況。 因此,從調用者的角度來看,以下內容將是無意義的:
int process()
{
bool success = false
if (the process was successful)
success = trrue;
return success;
};
通常,它應該是
bool process()
{
bool success = false
if (the process was successful)
success = true;
return success;
}
主要是:
int main()
{ return process() ? EXIT_SUCCESS : EXIT_FAILURE; }
要么
int process()
{
int result = EXIT_FAILURE
if (the process was successful)
result = EXIT_SUCCESS
return result;
};
主要是:
int main()
{ return process(); }
回復:陷阱。 int-as-bool的問題在於人們這樣做(有點人為,但你明白了):
typedef int BOOL
#define TRUE 1
#define FALSE 0
BOOL FDoSomething()
{
// code code code
return numTimesIDidSomething;
}
void Func()
{
// code code code
if(FDoSomething() == TRUE) // ERROR!
{
//etc
}
}
如果numTimesIDidSomething大於1,那么這是一個錯誤。
這導致了兩件事,
只需使用bool。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.