在头文件中声明和定义,但使用预处理器并在cpp中包含头文件?

时间:2014-07-22 12:20:40

标签: c++

今天我遇到了一些有线代码,我想知道这是否有任何专业人士或专业人士使用(我真的很困惑,所以对我来说这是一个不行的;))

不,我不寻求意见,我想知道什么可以改善或贬低(?)。

myclass.h:

#pragma once

class MyClass
{
public:
    MyClass();
    // other function declarations
private:
#ifdef DEF
   int _var;
#endif
};

#ifdef DEF
MyClass::MyClass():_var(0)
{
    // code goes here
}
// definition of the other member functions
#endif

myclass.cpp:

#include "def.h"

def.h

#define DEF
#include "myclass.h"

3 个答案:

答案 0 :(得分:2)

有条件地声明私有数据成员肯定是错误的 - 这意味着该类将在不同的翻译单元中具有不同的定义(实际上是不同的大小和布局)。

有条件地定义函数是奇怪且容易出错的,但只要它只在一个翻译单元中定义就没有本质上的错误(如果只有一个文件包含"def.h",这里似乎就是这种情况)。更常规的是将定义放在源文件中,或在标题中定义inline

答案 1 :(得分:1)

标头不支持在多个翻译单元中使用,因为它的构造函数的实现未声明为inline

这就像是一个明确的骗局。

const成员_var未定义,这意味着代码可能无法链接。那真是太可惜了。

使用前缀下划线约定可以使程序员为全局命名空间中的事物执行此操作,禁止使用它。最好避免这种惯例。解精

使用预处理程序符号来包含或排除数据成员是脆弱的,因为它可能导致不同翻译单元中的不同类定义。这也是有问题的。保养。取代它取决于它想要解决的问题。

答案 2 :(得分:0)

这是根据某些选项包含/排除代码行的做法。它对于OS相关部件非常有用。为特定文件定义选项也很有用;例如Catch使用它as follows

#define CATCH_CONFIG_MAIN  // This tells Catch to provide a main() - only do this in one cpp file
#include "catch.hpp"

定义哪个翻译单元应包含main函数。