这个类是在我的项目中定义的:
class B : public A
{
public:
A& Get_a(int type);
...
protected:
#ifdef COMPILE_FLAG
int line_num;
const char* file_name;
#endif
...
private:
int int_value;
bool bool-val;
};
函数Get_a
是这样实现的(我只放了相关部分):
A& B::Get_a(int type)
{
B* returned_a = B->Get_val(type);
return *(A*)(returned_a) ;
}
这是我使用这个类的代码:
{
...
B b_val;
A* a_val = &b_val->Get_a(5);
...
}
我的代码被编译为与类 A 和 B 被编译到的 DLL 不同的 DLL。
我的 DLL 不使用标志 COMPILE_FLAG 编译,但是 A、B 的 DLL 确实使用这个标志编译。
即使我的代码试图从不同的 B 类进行转换,我也没有收到任何编译错误。
在我的代码执行期间,a_val
有垃圾字段值;实际上改变了值(value)观。
我想要一些关于为什么 C++ 编译器没有警告我这个错误的解释,以及如何改进这些 #ifdef
定义的编码提示(我被告知这些字段是用于日志记录)。
编辑:如果我要写两个同名的类,每个类在不同的 dll 中。然后,如果我在它们之间创建一个引用,我会得到一个编译错误。预处理器在编译器之前运行,因此编译器可以检查类的重新定义。
最佳答案
#ifdef
是预处理器指令。预处理作为编译的第一部分执行。只有在预处理之后,正常的 C++ 语法才必须是有效的并且可以被检查。
#ifdef
违反了 One Definition Rule :在不同的翻译单元中,类 B
有两种不同的定义(大小不同)。编译器无法检测到这一点。作为结论,我会说这是您代码中的错误。作为编码技巧,我建议使用相同的编译器设置编译所有文件。在这种特殊情况下,我会删除 #ifdef
。
关于c++ - 在类字段上使用预处理器 #ifdef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17161744/