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;
}
非常感谢任何建议,
答案 0 :(得分:1)
C“if”语句将零解释为false,绝对将其他任何内容都解释为true。因此,对于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
>>
答案 1 :(得分:1)
一个区别是,在(!FALSE)
的情况下,如果你改变:
#define FALSE 0
到
#define FALSE 1
你的程序仍然“正常”,没有修改为TRUE ...但是,不管怎样,它不太可能是安全的,因为我确信你的程序依赖于
这样的结构if (funtion_that_returns_FALSE()) {
}
如果您更改FALSE
的定义,哪个会中断。不要改变它:)
答案 2 :(得分:1)
编辑:我向后看了这个问题。抱歉。由于TRUE为!FALSE且FALSE为0,因此TRUE为1。
编译器无论如何都会将FALSE评估为0,因为它会看到(!1)在运行时计算没有意义。
这太傻了。
答案 3 :(得分: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,冲突以及这些定义是否会在将来发生变化。