c++ - 类定义中的宏相关访问说明符是否会导致未定义的行为?

标签 c++ compiler-construction undefined-behavior

假设我有以下两个类定义(只有 bar() 的访问说明符不同,其他一切都相同):

class MyClass {
public:
    void foo();
    void bar();   // bar() is public

private:
    int member;
};

class MyClass {
public:
    void foo();

private:
    void bar();   // bar() is private
    int member;
};

编译器是否认为这些类在编译器生成的代码方面是“不同的”? (或者换句话说:除了访问权限检查之外,编译器是否会以不同的方式对待它?)

这与以下问题是同一个问题:以下代码是否会导致诸如未定义行为之类的任何问题? (前提是它是在不同的单元中编译的,无论是否定义了 X,然后再链接在一起。)

class MyClass {
public:
    void foo();

#ifdef X
private:
#endif
    void bar();

private:
    int member;
};

我对独立于编译器的答案以及特定于 GCC 的答案感兴趣(因为这是我的主要目标编译器)。

如果我们想通过在“包”中定义特定的宏来在 C++ 中“模拟”诸如 Java 世界中的 package private 之类的东西,这就变得很有趣。

最佳答案

违反单一定义规则绝对是未定义行为,该规则要求同一类类型的所有定义都相同。

请注意,类的内存布局仅在每个访问级别内指定,因此更改访问级别实际上可能会导致该类的不同内存布局。

关于c++ - 类定义中的宏相关访问说明符是否会导致未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12629611/

相关文章:

c++ - 具有 const 和 nonconst 成员的 union ?

c++ - 在 opencv 中使用 findContours 时出错

c++ - 什么是编译时生成的map文件

c++ - 一些编译器有趣的事情正在进行吗?

c++ - 获取数组/vector 末尾地址的未定义行为?

r - 如果用户使用行过滤器表达式调用 select() 而不是 filter() ,确切的 dplyr 行为是什么? (陷阱)

c++ - 封装一个 "include"所以只暴露选定的类

c++ - 在没有类型删除的情况下用 C++ 构建事件驱动系统的设计模式?

c++ - 如何正确使用带有智能指针和自定义类的 map 作为键和值

c - 如何更改VS的编译器?