假设我有以下两个类定义(只有 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/