c++ - 在类字段上使用预处理器 #ifdef

标签 c++

这个类是在我的项目中定义的:

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/

相关文章:

c++ - 是否可以推断出 std::insert_iterator 包含的类型?

c++ - 对 double 类型的二维 vector 进行 PCA 计算

c++ - 使用过多的静电是好事还是坏事?

c++ - ATL 如何将 BSTR* str 转换为注册表项。SetValue(LPCTSTR str 类型

c++ - 模板参数中的 "T"和 "const T"有什么区别吗?

c++ - MFC:如何在具有 LVS_EX_CHECKBOXES 样式的列表 ctrl 中结束复选框按钮

c++ - 如何将比较运算符应用于两个匿名结构中的每个变量?

c# - Win 32 Dll 在 Activex 中工作但在 C++/c# 测试应用程序中崩溃

c++ - 当/MT 和/MD 都需要时怎么办?

c++ - 你能合法地将dynamic_cast转换为多态类的非多态基类吗