定义对象宏

时间:2010-06-29 16:17:41

标签: c

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;
}

非常感谢任何建议,

4 个答案:

答案 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,冲突以及这些定义是否会在将来发生变化。