2010-06-29 3 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 

Ваша программа до сих пор "работает", не изменяя ИСТИНА ... однако, маловероятно, что это было бы безопасно в любом случае, потому что я уверен, что ваша программа основана на конструкциях, таких как

if (funtion_that_returns_FALSE()) { 
} 

Что бы сломалось, если вы изменили определение FALSE. Не меняйте его :)

1

Оператор C "if" интерпретирует нуль как false и абсолютно что-либо еще как истинное. Поэтому не важно, какое значение вы используете для 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) { ... } , которые вы не должны, на самом деле. –

+0

! является булевым оператором в C и возвращает 1, если аргумент, который вы ему дали, равен нулю и возвращает 0 в противном случае. Люди иногда думают! является оператором «swap the bits», но это не так. Но ваш вопрос хорошо сделан. При написании C вы можете полагаться на «false» равным нулю, но ошибочно полагаться на «истину», имеющую какое-либо конкретное значение, вы можете быть уверены только в том, что это не ноль :) – eemz

1

Редактировать: Я прочитал вопрос назад. Сожалею. Поскольку TRUE is! FALSE и FALSE равно 0, тогда TRUE равно 1.

Компилятор будет оценивать FALSE равным 0, так как он увидит (! 1), который не имеет смысла вычислять во время выполнения.

Это просто глупо.

+1

в c, ничего не равно нулю. Это именно то, что представляет код. Я не думаю, что это глупо, на самом деле это может быть даже более разумно, чем произвольно выбирать истинную ценность. – Stephen

+0

@Stephen: 1 не является произвольной величиной. Булева оценка в C возвращает либо 0 для false, либо 1 для true. Таким образом, определение TRUE с 1 имеет смысл. Использование! 0 (что равно 1), конечно, немного более ясное в отношении фактов, но если вам нужно объясниться здесь, чтобы напомнить об этих основных фактах, тогда вы живете опасной жизнью как программист С, так или иначе. ;) – Secure

+0

@ Обязательно: я, конечно, согласен, что в зависимости от этих деталей идет опасная линия :) Возможно, произвольный был слабым выбором слов с моей стороны. Моя точка зрения заключалась в том, что 'if (c)' только оценивает ветвь 'else', если' c' оценивает ноль. Поэтому важно, чтобы «TRUE» представлялось чем-то ненулевым. Yay для разработки типа 'bool'! :) – Stephen

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, если он когда-либо сталкивается с случаем, когда его допущения неверны.

В конечном итоге программа будет переписывать себя повторно до тех пор, пока она не будет правильно, и таким образом вам не придется беспокоиться о том, как определяются ИСТИНА и ЛОЖЬ, конфликты и будут ли эти определения изменяться в будущем.

Смежные вопросы