Cpp,执行预处理程序评估命令

时间:2018-12-19 16:40:07

标签: c++ c++17 preprocessor

给出以下代码段,每个.h和.cpp文件中都有预处理器技巧,是否可以按调用函数的顺序评估相关的预处理器函数?对于必须维护这一点的程序员,我该如何解决呢?

#include "Foo.h"
#include "Bar.h"
#include "Qux.h"

int main()
{
    Foo foo = Foo();
    Bar bar{};
    foo.doFoo();
    Qux::doQux();
    return 0;
}

编辑: 一些澄清,假设Foo,Bar,Qux .cpp和.h声明了预处理程序定义。 我可以强制预处理器对Foo.h,Foo.cpp,Bar.h和Bar.cpp进行评估吗?

2 个答案:

答案 0 :(得分:1)

  

我可以强制执行Foo.h,Foo.cpp,Bar.h和Bar.cpp之前进行评估   由预处理器Qux.h?

不是通过预处理器,不是。强制执行此类解析顺序的通常方法是通过#include指令-例如,如果您想保证Foo.hBar.h始终在Qux.h之前进行解析,然后在#include顶部添加Qux.h行以保证它:

// Qux.h
#ifndef QUX_H
#define QUX_H

#include "Foo.h"
#include "Bar.h"

[...]

#endif

答案 1 :(得分:1)

  

我可以强制执行Foo.h,Foo.cpp,Bar.h和Bar.cpp之前进行评估   Qux.h

您可以在Foo.h之前强制包含Bar.hQux.h,这是一种实现方法:

1)放在Foo.h的开头(甚至结尾):

#ifndef FOO_H_INCLUDED
#define FOO_H_INCLUDED
#endif

2)放在Bar.h的开头(或结尾):

#ifndef BAR_H_INCLUDED
#define BAR_H_INCLUDED
#endif

(如果您愿意的话,以上内容实际上也可以用作包含防护)

3)签入Qux.h

#ifndef FOO_H_INCLUDED
#error Please include Foo.h before Qux.h!
#endif

#ifndef BAR_H_INCLUDED
#error Please include Bar.h before Qux.h!
#endif

另一种方式-只需添加到Qux.h的开头:

#include "Foo.h"
#include "Bar.h"

这迫使Foo.hBar.h始终在其余Qux.h之前进行处理(而不必检查包含定义)。

Foo.cppBar.cpp与此无关,它们是在单独的编译器(和预处理器)运行中构建的独立翻译单元。