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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在scons中将访问说明符从私有更改为公共?相关的知识,希望对你有一定的参考价值。

我使用scons构建一个大型项目,最后在SConstruct文件中找到一行,导致我之前发布的编译错误:sstream redeclared with public access compiler error

这是SConctruct文件中的行:

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

如果您查看错误消息的链接,该错误消息会在sstream库中重新定义访问说明符,那么当我编辑SConstruct行时,该错误就不再出现了:

jailbreak_env = env.Clone(CPPDEFINES=[])

但是,我无法弄清楚这个修复程序究竟是如何工作的,甚至不知道如何在c ++中更改访问说明符?我花了一些时间研究SCons,我了解到Clone()只是创建了一个新的程序“越狱版本”,但是通过使用CPP_DEFINES变量彻底改变了c ++编译器环境。但CPP_DEFINES的scons文档(http://www.scons.org/doc/0.96.90/HTML/scons-user/a3061.html)没有提到用于更改访问说明符,如上所示?

欢迎任何有关我应该寻求解释的想法或指示。

答案

link into SCons' documentation that you mention above确实明确说明(搜索CPPDEFINE关键字):

如果$ CPPDEFINES是一个列表,$ CPPDEFPREFIX和$ CPPDEFSUFFIX构造变量的值将附加到列表中每个元素的开头和结尾。如果任何元素是列表或元组,则第一个项目是正在定义的名称,第二个项目是其值。

你的元组

('protected','public')

将简单地传递给预处理器/编译器

-Dprotected=public

,这将适用于给定的任何字符串。对于这个访问说明符没有什么特别之处,你应该在构建的输出中看到给定编译器的定义(除非你重新定义了SCons构建步骤的标准输出)。

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

SConstruct
==========

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

main.cxx
========

int main(void)
{
  return 0;
}

当他们调用“scons”时,你得到预期的输出(在Linux下):

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.

以上是关于在scons中将访问说明符从私有更改为公共?的主要内容,如果未能解决你的问题,请参考以下文章

使用 terraform 将公共 GKE 更改为私有 GKE 集群

在没有编译错误的情况下更改对方法的访问

在派生类中将公共父析构函数设为私有

苹果拒绝我的应用程序在 Xcode 中将部署目标从 6.0 更改为 8.0 [重复]

将Google云端硬盘文件从公开更改为私有

在 Amazon S3 中将在 aws3 存储桶中创建的文件夹设为公共或私有文件夹