小编Chr*_*ris的帖子

通过 C++ 使用 POSIX 功能测试宏

当我构建 POSIX C 程序时,我希望能够移植并仅使用 POSIX 或标准 C 库函数。因此,例如,使用 gcc 或 clang,我会这样构建:

\n

gcc -std=c99 -D_XOPEN_SOURCE=600

\n

将标准设置为 C99 会删除所有扩展,然后_XOPEN_SOURCE公开 POSIX 接口。我的环境不再被 GNU、BSD 等扩展所污染。

\n

然而,C++ 的情况似乎更加阴暗。我想做这个:

\n

g++ -std=c++14 -D_XOPEN_SOURCE=600

\n

这对我来说在各种操作系统上都运行良好:至少是 Linux/glibc、Haiku、MinGW、macOS。但显然,POSIX 功能测试宏和 C++ 存在问题。Oracle 文档有这样的说法:

\n
\n

没有为 POSIX 或 SUSv4 定义 C++ 绑定,因此指定功能测试宏(例如 _POSIX_SOURCE、_POSIX_C_SOURCE 和 _XOPEN_SOURCE)可能会由于标准 C++ 和这些规范的要求冲突而导致编译错误。

\n
\n

虽然我没有 Oracle Solaris 的副本,但我发现 FreeBSD 和 OpenBSD 存在问题。

\n

在 FreeBSD 上:

\n
#include <iostream>\nint main() { }\n
Run Code Online (Sandbox Code Playgroud)\n
$ clang++ -std=c++14  -D_POSIX_C_SOURCE=200112L …
Run Code Online (Sandbox Code Playgroud)

c++ posix

9
推荐指数
1
解决办法
463
查看次数

Python是否需要对继承链中所有类的深入了解?

Python类没有公共/私有的概念,因此我们被告知不要触摸以下划线开头的东西,除非我们创建它.但是,这不需要直接或间接地完全了解我们继承的所有类吗?见证人:

class Base(object):
    def __init__(self):
        super(Base, self).__init__()
        self._foo = 0

    def foo(self):
        return self._foo + 1

class Sub(Base):
    def __init__(self):
        super(Sub, self).__init__()
        self._foo = None

Sub().foo()
Run Code Online (Sandbox Code Playgroud)

预计TypeError会在None + 1评估时提高.所以我必须知道_foo基类中存在的东西.为了解决这个问题,__foo可以使用它,通过修改名称来解决问题.这似乎是一种可接受的解决方案,如果不是优雅的话.但是,如果Base从类(在单独的包中)继承,会发生什么Sub?现在__foo,我在祖父母的Sub覆盖.__fooSub

这意味着我必须知道整个继承链,包括每个使用的所有"私有"对象.Python是动态类型的这一事实使得这更加困难,因为没有要搜索的声明.然而,最糟糕的部分可能是现在Base可能继承的事实object,但在未来的某个版本中,它会转而继承Sub.显然,如果我知道Sub是继承自的,我可以重命名我的课程,无论多么烦人.但我看不到未来.

这不是真正的私有数据类型可以防止出现问题的情况吗?在Python中,如果这些脚趾可能会在未来的某个时刻出现,我怎么能确定我不会不小心踩到某个人的脚趾?

编辑:我显然没有明确主要问题.我熟悉名称修改以及单下划线和双下划线之间的区别.问题是:我如何处理这样一个事实,即我可能会碰到现在我不知道的类?如果我的父类(在我没有编写的包中)恰好从一个与我的类同名的类继承,那么名称修改也无济于事.我认为这是一个真正的私人成员会解决的(角落)案例,但是Python有问题吗?

编辑:根据要求,以下是一个完整的例子:

档案parent.py:

class Sub(object):
    def __init__(self):
        self.__foo = 12
    def foo(self):
        return self.__foo + 1
class …
Run Code Online (Sandbox Code Playgroud)

python private subclass

7
推荐指数
2
解决办法
333
查看次数

当你不控制 main 时,C++ 中的动态初始化

我有一个相当特殊的 C++14 初始化问题。我正在链接一个提供main(). 该库使用了我要定义的全局数组,如下所示:

extern int array[];

int main(void)
{
    for (int i = 0; array[i] != -1; i++) {
        printf("%d\n", i);
    }
}
Run Code Online (Sandbox Code Playgroud)

预期用途是初始化数组,例如int array[] = {1, 2, 3, -1}。但我希望能够动态初始化它。我使用的是 C++14,所以我的想法是创建一个带有写入数组的构造函数的全局对象,如下所示:

int array[2];

struct Init {
    Init() {
        array[0] = 1;
        array[1] = -1;
    }
}

Init init;
Run Code Online (Sandbox Code Playgroud)

但 C++14 标准是这样说的:

具有静态存储持续时间的非局部变量的动态初始化是否在 main 的第一条语句之前完成是实现定义的。如果初始化被推迟到 main 的第一个语句之后的某个时间点,则它应发生在与要初始化的变量相同的翻译单元中定义的任何函数或变量的第一个 odr-use (3.2) 之前。

我是否正确地阅读了这篇文章,有可能当main()运行时,我的对象可能还没有被构造,这意味着我的数组不会被初始化(或者更确切地说,将默认初始化,而不是由我的类初始化)?

如果是这样,有什么办法解决这个问题吗?我无法控制提供main(). 我想要在启动时、main()运行之前设置数组的值是不是运气不好?

c++ c++14

4
推荐指数
1
解决办法
168
查看次数

标签 统计

c++ ×2

c++14 ×1

posix ×1

private ×1

python ×1

subclass ×1