C++ 弄虚作假↔ 错误的

C++ 弄虚作假↔ 错误的,c++,c-preprocessor,C++,C Preprocessor,这个问题没有实际用途!我问这个只是因为我好奇 < C++ >有一种方法,通过编写某个定义真假的假象来伪造真,然后在代码中的所有地方都被认为是错误的。但我在寻找一种方法,同时把真的证伪为假,把假的证伪为真: #define true false #define false true 这不起作用,尝试保存原始true也不起作用: #define temptrue true #define true false #define false temptrue 你知道有什么办法吗? < P>这显然没有

这个问题没有实际用途!我问这个只是因为我好奇

< C++ >有一种方法,通过编写某个定义真假的假象来伪造真,然后在代码中的所有地方都被认为是错误的。但我在寻找一种方法,同时把真的证伪为假,把假的证伪为真:

#define true false
#define false true
这不起作用,尝试保存原始true也不起作用:

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

你知道有什么办法吗?

< P>这显然没有实际用途,也不是有效的C++,但下面的技巧是:

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

#define true fake_true
#define false fake_false

简单地使用数字文字如1和0可能看起来更简单,但是在类型如超载分辨率的情况下会导致不同的语义。

< P>这显然没有实际用途,并且不是有效的C++,但是下面的技巧是:

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

#define true fake_true
#define false fake_false

简单地使用数字文字(例如1和0)可能看起来更简单,但在类型重要的情况下(例如重载解析)会导致不同的语义。

可能是这样的吗

#define false static_cast<bool>(1)
#define true  static_cast<bool>(0)
关于未定义的行为:

那些说它没有定义的人可能指的是这个问题的答案:

但是,如果你不使用标准C++库,引用的限制不适用于Bathsheba和Martin York。 16.5.4.1[约束.概述] 子16.5.4描述了使用C++标准库的设备对C++程序的限制。 ... 16.5.4.3.2[宏名称]。。。 翻译单位不得定义或取消定义与关键字在词汇上相同的名称。。。


也许是这样的

#define false static_cast<bool>(1)
#define true  static_cast<bool>(0)
关于未定义的行为:

那些说它没有定义的人可能指的是这个问题的答案:

但是,如果你不使用标准C++库,引用的限制不适用于Bathsheba和Martin York。 16.5.4.1[约束.概述] 子16.5.4描述了使用C++标准库的设备对C++程序的限制。 ... 16.5.4.3.2[宏名称]。。。 翻译单位不得定义或取消定义与关键字在词汇上相同的名称。。。

使用constexpr变量,而不是更改true和false的行为

使用constexpr变量,而不是更改true和false的行为


试图定义C++关键字的行为未定义。别这样

不太漂亮,但是

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

可能是你能做的最好的。

< P>试图定义C++关键字的行为是未定义的。别这样

不太漂亮,但是

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

这可能是您能做的最好的了。

这是未定义的行为。这是意料之中的。谢谢@MSalters。当然,除了我的回答之外;-这是本页上唯一合理的评论或答案。@Bathsheba我的和接受的答案都指出,这是未定义的,没有意义。不允许从语言中重新定义任何关键字。它使程序基本无效。参见第17.6.4.3节保留名称第2段翻译单位不得定义或取消定义与**关键字**、表2中列出的标识符或7.6中描述的属性标记在词汇上相同的名称。请参阅第2.11节关键字,了解包含true和false的关键字。这是未定义的行为。这是意料之中的。谢谢@MSalters。当然,除了我的回答之外;-这是本页上唯一合理的评论或答案。@Bathsheba我的和接受的答案都指出,这是未定义的,没有意义。不允许从语言中重新定义任何关键字。它使程序基本无效。参见第17.6.4.3节保留名称第2段翻译单位不得定义或取消定义与**关键字**、表2中列出的标识符或7.6中描述的属性标记在词汇上相同的名称。请参阅第2.11节关键字,其中包括true和false。它很漂亮,但不幸的是,行为未定义。更新到标准的最新版本,因此我得到了正确的答案。我的副本有几个旧版本。见第16.5.4.3.2节宏名称:第2段翻译单位不得定义或取消定义与关键字、表4所列标识符或9.12所述属性标记在词汇上相同的名称,除了“可能”和“不可能”的名称可以定义为类似于宏15.6的函数之外。@jhx:第1段明确处理了包括标准库中的头文件。第2款没有限制,一直适用。仅针对标准库进行链接调用16.5.4.1不需要包含头文件。除非您是嵌入式系统的一小部分,否则您需要与标准库链接以使应用程序运行。@MartinYork:只是为了确保这些异议和澄清有上下文背景。您引用的一节仍然受16.5.4[约束]的约束,16.5.4.1[约束.概述]说它仅适用于使用标准li时
布雷。这一点已在答复中得到澄清。谢谢你的帮助。它很漂亮,但不幸的是,它的行为没有定义。更新到最新版本的标准,所以我得到了正确的我的副本是一些旧版本。见第16.5.4.3.2节宏名称:第2段翻译单位不得定义或取消定义与关键字、表4所列标识符或9.12所述属性标记在词汇上相同的名称,除了“可能”和“不可能”的名称可以定义为类似于宏15.6的函数之外。@jhx:第1段明确处理了包括标准库中的头文件。第2款没有限制,一直适用。仅针对标准库进行链接调用16.5.4.1不需要包含头文件。除非您是嵌入式系统的一小部分,否则您需要与标准库链接以使应用程序运行。@MartinYork:只是为了确保这些异议和澄清有上下文背景。您引用的一节仍然受16.5.4[约束]的约束,而16.5.4.1[约束.概述]说它只适用于使用标准库的情况。这一点已在答复中得到澄清。谢谢你的帮助。@KonradRudolph:你赢了,下次我在剑桥的时候我会给你准备午餐。谢谢。午餐还得等一等,特别是因为我现在也被困在伦敦,还在坎伯斯工作,但去年搬到了卡姆登。这是唯一合法的建议。@KonradRudolph:你赢了,下次我在剑桥时我会给你拿午餐。谢谢。午餐还得等,特别是因为我现在也被困在伦敦,还在坎布斯工作,但去年搬到了卡姆登。这是唯一合法的建议。小心。宏真和假定义在许多C头文件中,可以由C++头文件包含。小心。宏真和假定义在许多C头文件中,这些文件可以由C++头文件包含。