2010-06-29 36 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,冲突以及这些定义是否将在未来发生变化。