2010-06-29 88 views
0

gcc 4.4.4 c89定義對象宏

我在某些代碼中看到了這種情況。

#define FALSE 0 
#define TRUE (!FALSE) 

有書面以下任何區別:

#define FALSE 0 
#define TRUE 1 

它的一些功能被這樣使用:

if(condition failed) { 
    return FALSE; 
} 
else { 
    return TRUE; 
} 

非常感謝您的任何建議,

回答

1

一個區別是,在(!FALSE)情況下,如果你改變:

#define FALSE 0 

#define FALSE 1 

你的程序仍然是 「作品」,而無需修改TRUE ......然而,這是不太可能的,因爲我相信你的程序依賴於構造,如

if (funtion_that_returns_FALSE()) { 
} 

如果更改FALSE的定義,會中斷。不要改變它:)

1

的C「如果」語句將零解釋爲錯誤,並且絕對是完全正確的。所以,你使用TRUE的價值並不重要,儘管1是常規的。

但無論如何(!0)== 1所以這不應該改變任何東西。

>> cat joe.c 
#include <stdlib.h> 

#define FALSE 0 
#define TRUE (!FALSE) 

int main (int argc, char * argv[]) { 
    printf("false %d\ntrue %d\n", FALSE, TRUE); 
    return 0; 
} 
>> cc joe.c 
>> ./a.out 
false 0 
true 1 
>> 
+0

但是(!0)== 1 我想你可能會發現這是依賴於實現的。但它沒有多大意義,除非你有一個像你沒有應該 如果(bool_value == TRUE){ ... } 的條件,真的。 – 2010-06-29 16:55:22

+0

!是C中的一個布爾運算符,如果您給它的參數爲0,則返回1,否則返回0。人們有時會想!是一個「交換位」操作符,但事實並非如此。但是你的觀點是很好的。在編寫C時,你可以依靠「false」爲零,但依靠具有任何特定值的「true」是錯誤的,你只能確定它不爲零:) – eemz 2010-06-29 18:22:01

1

編輯:我向後讀了問題。抱歉。由於TRUE爲!FALSE且FALSE爲0,因此TRUE爲1.

無論如何,編譯器會將FALSE評估爲0,因爲它會看到(!1),它在運行時沒有意義進行計算。

這只是愚蠢的。

+1

在c中,任何不爲零爲真。這正是代碼所代表的。我不認爲這很愚蠢,實際上它可能比任意選擇真實價值更爲理智。 – Stephen 2010-06-29 16:30:18

+0

@Stephen:1不是任意值。 C中的布爾值評估返回0代表假或1代表真。因此用1來定義TRUE是非常有意義的。當然,使用!0(它是1)對於事實有點更明確,但是如果你需要在這裏清楚地提醒這些基本事實,那麼無論如何,作爲一名C程序員你都會過着危險的生活。 ;) – Secure 2010-06-29 16:42:46

+0

@Secure:我當然同意取決於這些細節是走在危險的路線:)也許任意性是我的一個糟糕的選擇。我的觀點是,如果(c)'只評估'else'分支,如果'c'評估爲零。所以,只有'TRUE'由非零表示纔是重要的。 Yay開發'bool'類型! :) – Stephen 2010-06-29 17:27:06

0

做到這一點,最好的辦法是:

#ifndef FALSE 
#define FALSE 0 
#elif FALSE != 0 
#undef FALSE 
#define FALSE REWRITE_PROGRAM("FALSE") 
#endif 

#ifndef TRUE 
#define TRUE 1 
#elif TRUE != 1 
#undef TRUE 
#define TRUE REWRITE_PROGRAM("TRUE") 
#endif 

哪裏REWRITE_PROGRAM是調用一個函數(提供事先的行號和源文件),採用先進的神經網絡的宏,將智能重寫代碼,以避免TRUE或FALSE的定義發生衝突,其中TRUE定義爲除1之外的任何值,FALSE爲非0之外的任何值。在生成更正後的代碼並生成它之後,它將執行新構建的應用程序版本並退出。

作爲備份,重寫AI還會在REWRITE_PROGRAM的代碼中添加更多代碼,以確保它的新假設是正確的,只要它遇到假設不正確的情況。

最終,程序會重複自我重複,直到它是正確的,這樣您就不必擔心定義了TRUE和FALSE,衝突以及這些定義是否將在未來發生變化。