gpt4 book ai didi

c - 为什么 "#if !(protected) and !(private)"无法防御 "#define private public"?

转载 作者:行者123 更新时间:2023-11-30 20:05:19 25 4
gpt4 key购买 nike

我尝试采取一些措施来防止有人像这样强制私有(private)化:

#define private public
#if !(protected) and !(private)
#define A 1
#endif
class B{
private:
int c;
};
int main(){
int a=A;
B b;
b.c=2;
};

一开始我认为这段代码无法编译,因为

#define private public

将触发

#if !(protected) and !(private)

防止A定义。但实际上这段代码可以编译,但同时我可以直接访问B的私有(private)成员,这意味着私有(private)已经变成了公共(public)。但为什么A还能定义呢?

最佳答案

你永远不应该#define关键字,例如 private 。如果您包含来自同一个 .cpp 的标准库的任何部分文件(甚至是基本语言功能所需的部分,如 <new><initializer_list> ),行为是未定义的。

也就是说,当 #if计算其表达式时,任何标识符或关键字标记都被视为数字零。解读如下:

  1. #if !(protected) and !(private)
  2. #if !(protected) and !(public)
  3. #if !(0) and !(0)
  4. #if true

您可能正在寻找 defined运算符,它告诉您其操作数是否是宏。

#if ! defined(protected) and ! defined(private)

不过,请不要这样做。

<小时/>

如果您的目标是防止某人窃取关键字,可以这样做:

#if defined(protected) || defined(private) || …
# error Do not hack keywords!
#endif

这对于防御性编码来说太过分了。 C++ 并没有真正为您提供弹药来防止用户攻击您的库。不遵守规则的用户会在伤害你之前先伤害自己……只需明确表示不支持奇怪的程序即可。即使这样也应该是不必要的,这是不言而喻的。

关于c - 为什么 "#if !(protected) and !(private)"无法防御 "#define private public"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32322421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com