给出以下代码段,每个.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进行评估吗?
答案 0 :(得分:1)
我可以强制执行Foo.h,Foo.cpp,Bar.h和Bar.cpp之前进行评估 由预处理器Qux.h?
不是通过预处理器,不是。强制执行此类解析顺序的通常方法是通过#include
指令-例如,如果您想保证Foo.h
和Bar.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.h
和Qux.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.h
和Bar.h
始终在其余Qux.h
之前进行处理(而不必检查包含定义)。
Foo.cpp
和Bar.cpp
与此无关,它们是在单独的编译器(和预处理器)运行中构建的独立翻译单元。