определение макрокоманд объекта - PullRequest
0 голосов
/ 29 июня 2010

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 ]

1 голос
/ 29 июня 2010

Одно отличие, в случае (!FALSE), если вы измените:

#define FALSE 0

на

#define FALSE 1

Ваша программа все еще "работает", не изменяя TRUE ...однако, вряд ли это было бы безопасно в любом случае, потому что я уверен, что ваша программа использует такие конструкции, как

if (funtion_that_returns_FALSE()) {
}

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

1 голос
/ 29 июня 2010

Редактировать: я читаю вопрос задом наперед. Сожалею. Поскольку ИСТИНА - ЛОЖЬ, а ЛОЖЬ - 0, ИСТИНА - 1.

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

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

1 голос
/ 29 июня 2010

Оператор C "if" интерпретирует ноль как ложь, и абсолютно все остальное как истину. Так что не очень важно, какое значение вы используете для ИСТИНА, хотя 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 голосов
/ 30 июня 2010

Лучший способ сделать это:

#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 - это макрос, который вызывает функцию (заранее предоставив номер строки и исходный файл), которая с помощью расширенных нейронных сетей будет разумно переписыватьВаш код, чтобы избежать противоречивых определений ИСТИНА или ЛОЖЬ, где ИСТИНА определена как что-то, отличное от 1, и ЛОЖЬ, чтобы быть любым, кроме 0. После того, как он сгенерирует исправленный код и создаст его, он выполнит вновь созданную версиюприложение и выход.

В качестве резервной копии, AI перезаписи будет также проверять правильность своих новых предположений, добавляя больше кода с REWRITE_PROGRAM на случай, если его предположения неверны.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...