ifdef / ifndef的解决方法

时间:2013-02-26 04:41:16

标签: c++ class templates c-preprocessor conditional-compilation

我有一个班级A,以及两个班级BC,继承自A

除了A的方法之外,每个类都提供不同的内容,因此,我想将它们放在两个不同的文件中 - b.hppc.hpp ,因为它们是具有内联函数的模板。

我还有一个班级User,同时使用BC个班级。在user.cpp中,我应该接近:

# include "b.hpp"
# include "c.hpp"

class User{
    ...;
};

这会引发编译器重新定义错误,因为我在B中保留了Cbc.hpp个类。

除了编程错误之外,这里的问题还很美观:我只是在小应用程序中使用ifdef / ifndef指令找不到非常优雅 - 他们总是像IDE的解决方案一样对我说对于管理太多模块的人,以及那些甚至不了解指令的人。

是否有任何(甚至是非标准的,但至少是理智的)解决方法,或者我必须坚持在同一个文件中使用ifdef / ifndef两个不同的类?

3 个答案:

答案 0 :(得分:2)

如果你的意思是在头文件中,不,那就没有一个好的,可移植的方法来做到这一点。将所有头文件保留为格式是标准的 -

#ifndef MYHEADER_HPP
#define MYHEADER_HPP

// ... content

#endif

任何其他方式都是非标准的,而不是真正的 C ++。

答案 1 :(得分:2)

您始终可以使用#pragma once

答案 2 :(得分:1)

ifndef确实是很好的做法。它们可以帮助您使文件标题自包含

您不希望某个文件A停止编译,因为您在另一个文件include中的某处删除了C语句B。因此,您可以在CA中加入B。也许A包含B,但无所谓。否则,只要您从include C移除B,就必须在include C中添加A

所以ifndef确实是好的做法,应该使用。根据您的编译器,您可能有pragma once等语法快捷方式(查找讨论here) - 但请记住,即使大多数编译器都支持它也不标准。

顺便说一句,专业生产代码确实使用ifndef警卫。