Подделать истину ↔ ложь - PullRequest
1 голос
/ 14 июля 2020

Практического применения этот вопрос не имеет! Я спросил об этом только потому, что мне любопытно!

В C ++ есть способ фальсифицировать истину как ложь, написав где-нибудь #define true false, и тогда true в коде будет считаться false. Но я ищу способ подделать true как false и false как true одновременно:

#define true false
#define false true

Это не работает, и я пытаюсь "сохранить "оригинал true тоже не работает:

#define temptrue true
#define true false
#define false temptrue

Вы знаете, как это сделать?

Ответы [ 4 ]

2 голосов
/ 14 июля 2020

Поведение при попытке #define ключевого слова C ++ не определено. Не делайте этого!

Это не совсем так, но

static constexpr bool true_ = false;
static constexpr bool false_ = true;

, вероятно, лучшее, что вы можете сделать.

2 голосов
/ 14 июля 2020

Может, что-то вроде этого?

#define false static_cast<bool>(1)
#define true  static_cast<bool>(0)

Относительно неопределенного поведения:

Те, кто говорят, что это undefined, вероятно, имеют в виду ответ на этот вопрос: Законно ли переопределять ключевое слово C ++?

Однако, если вы не используете стандартную библиотеку C ++, указанное ограничение не применяется (слава Батшебе и Мартину Йорку).

16.5.4.1 [constraints.overview]
Подпункт 16.5.4 описывает ограничения для программ C ++, которые используют возможности стандартной библиотеки C ++.
...
16.5.4.3.2 [macro.names] ...
Единица перевода не должна #define или #undef имен, лексически идентичных ключевым словам, ...
C ++ 2020 draft

1 голос
/ 14 июля 2020

используйте переменные constexpr, а не изменяйте поведение true и false.

static constexpr bool TRUE = false;
static constexpr bool FALSE = true;
1 голос
/ 14 июля 2020

Очевидно, что это не имеет никакого практического применения и не является допустимым для C ++, но следующее помогает:

static constexpr auto fake_true = false;
static constexpr auto fake_false = true;

#define true fake_true
#define false fake_false

Простое использование литералов numeri c (например, 1 и 0) может показаться проще, но будет вызывают различную семантику в ситуациях, когда тип имеет значение (например, разрешение перегрузки).

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