gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:36:03 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com