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;
}
非常感谢您的任何建议,
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;
}
非常感谢您的任何建议,
一个区别是,在(!FALSE)
情况下,如果你改变:
#define FALSE 0
到
#define FALSE 1
你的程序仍然是 “作品”,而无需修改TRUE ......然而,这是不太可能的,因为我相信你的程序依赖于构造,如
if (funtion_that_returns_FALSE()) {
}
如果更改FALSE
的定义,会中断。不要改变它:)
的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
>>
编辑:我向后读了问题。抱歉。由于TRUE为!FALSE且FALSE为0,因此TRUE为1.
无论如何,编译器会将FALSE评估为0,因为它会看到(!1),它在运行时没有意义进行计算。
这只是愚蠢的。
在c中,任何不为零为真。这正是代码所代表的。我不认为这很愚蠢,实际上它可能比任意选择真实价值更为理智。 – Stephen 2010-06-29 16:30:18
@Stephen:1不是任意值。 C中的布尔值评估返回0代表假或1代表真。因此用1来定义TRUE是非常有意义的。当然,使用!0(它是1)对于事实有点更明确,但是如果你需要在这里清楚地提醒这些基本事实,那么无论如何,作为一名C程序员你都会过着危险的生活。 ;) – Secure 2010-06-29 16:42:46
@Secure:我当然同意取决于这些细节是走在危险的路线:)也许任意性是我的一个糟糕的选择。我的观点是,如果(c)'只评估'else'分支,如果'c'评估为零。所以,只有'TRUE'由非零表示才是重要的。 Yay开发'bool'类型! :) – Stephen 2010-06-29 17:27:06
做到这一点,最好的办法是:
#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,冲突以及这些定义是否将在未来发生变化。
但是(!0)== 1 我想你可能会发现这是依赖于实现的。但它没有多大意义,除非你有一个像你没有应该 如果(bool_value == TRUE){ ... } 的条件,真的。 – 2010-06-29 16:55:22
!是C中的一个布尔运算符,如果您给它的参数为0,则返回1,否则返回0。人们有时会想!是一个“交换位”操作符,但事实并非如此。但是你的观点是很好的。在编写C时,你可以依靠“false”为零,但依靠具有任何特定值的“true”是错误的,你只能确定它不为零:) – eemz 2010-06-29 18:22:01