C++ 在SCON中将访问说明符从私有更改为公共?

C++ 在SCON中将访问说明符从私有更改为公共?,c++,compiler-errors,scons,C++,Compiler Errors,Scons,我使用SCON构建了一个大型项目,最终在SConstruct文件中找到了一行代码,该代码导致了我之前在此处发布的编译错误: 以下是sconcstruct文件中的行: 越狱(jailbreak_env=env.Clone(CPPDEFINES=[('protected','public'),('private','public')) 如果查看错误消息的链接,该错误消息抱怨重新定义sstream库中的访问说明符,则当我编辑SCOnstuct行时,该错误不再出现,如下所示: jailbreak\u

我使用SCON构建了一个大型项目,最终在SConstruct文件中找到了一行代码,该代码导致了我之前在此处发布的编译错误:

以下是sconcstruct文件中的行:

越狱(jailbreak_env=env.Clone(CPPDEFINES=[('protected','public'),('private','public'))

如果查看错误消息的链接,该错误消息抱怨重新定义sstream库中的访问说明符,则当我编辑SCOnstuct行时,该错误不再出现,如下所示:

jailbreak\u env=env.Clone(cppfefines=[])

<>但是我无法理解这个修复方法是如何工作的,或者甚至如何改变C++中的访问说明符?我花了一些时间研究了SCons,我发现CRONE()只创建了一个新的“越狱版本”,但是通过使用CppYEngulink变量彻底改变C++编译器环境。但是CPP_定义的scons文档()没有提到用于更改访问说明符,如上所示

欢迎提供我应该在哪里寻找解释的任何想法或建议。

确实明确说明(搜索
CPPDEFINE
关键字):

如果$CPPDEFINES是一个列表,$CPPDEFPREFIX和 $CPPDEFSUFFIX构造变量将追加到开头 和列表中每个元素的结尾。如果任何元素是列表或 tuple,则第一项是要定义的名称,第二项是 物品就是它的价值

你的元组

('protected','public')
将简单地传递给预处理器/编译器作为

-Dprotected=public
,它将使用给定的任何字符串。访问说明符对此没有什么特别之处,您应该在生成的输出中实际看到给定给编译器的定义(除非您为SCON的生成步骤重新定义了标准输出)

您可以创建以下两个简单文件

SConstruct
==========

env = Environment(CPPDEFINES=[('foo','bar')])
env.Program('main', 'main.cxx')

main.cxx
========

int main(void)
{
  return 0;
}
在它们上调用“
scons
”时,您会得到预期的输出(在Linux下):


这样做是一个难以置信的坏主意!做什么是坏主意?做我做的编辑还是第一行代码?你能告诉我这一变化的原因或具体影响是什么吗?我应该指出,我不是编写这个SCons文件或主要项目的人,我只是想把它编译出来,上面是使它对我起作用的修复方法。“做什么是坏主意?”使用宏定义将
private
protected
重新定义为
public
。为什么你真的需要这个?正如我在问题中提到的,这就是我想要弄明白的。我甚至没有意识到这在C++中是可能的。我感到惊讶的是,较旧的编译器允许您逃脱这样的事情。我认为这是必要的,因为C++项目是这样设计的,所以很多功能可以在Python和Python中重用,显然“一切都需要设置为公共的”。尽管这可能是完全错误的…@miro_x我建议你去读一些关于预处理器工作原理的书。简单地说-Dsomething=somethingelse会将任何文本文件中出现的每一个内容都更改为somethingelse。如果您想进行实验,可以在命令行上尝试。SCons并没有更改访问说明符,它只是为编译器构建命令行。在这种情况下,由于请求的CPPDEFINES,它具有上面user0042回复中列出的效果。因此,Dprotected=public,实际上将源文件中的所有文本从protected更改为public?好的,从我的经验来看,在这种情况下,似乎只有在c++11之前才允许这样做。
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o main.o -c -Dfoo=bar main.cxx
g++ -o main main.o
scons: done building targets.