【问题标题】:Cpp, enforcing a preprocessor evaluation orderCpp,强制执行预处理器评估顺序
【发布时间】:2018-12-21 08:50:01
【问题描述】:

鉴于以下 sn-p 代码,每个 .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 声明预处理器定义。 我可以强制预处理器在 Qux.h 之前评估 Foo.h、Foo.cpp、Bar.h 和 Bar.cpp 吗?

【问题讨论】:

  • 预处理器在编译器之前运行。预处理器不知道函数调用是什么,编译器运行得太晚而无法干预。预处理器函数/宏在读取时就被评估,通常是因为#include
  • “按照调用函数的顺序评估关联的预处理器函数”是什么意思?示例代码与问题有什么关系?
  • @bathsheba 每当我没有被邀请参加聚会时,我都会自己做#include,这是真的
  • @SombreroChicken:你是因为未定义的行为,还是因为渗透测试失败而导致它崩溃?
  • @bathsheba 不是所有成功的渗透测试都未定义行为吗?导致产生子进程或不依赖于架构?

标签: c++ c++17 preprocessor


【解决方案1】:

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

您可以在Qux.h 之前强制包含Foo.hBar.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 与此无关,它们是在单独的编译器(和预处理器)运行中构建的单独的翻译单元。

【讨论】:

    【解决方案2】:

    我可以强制执行 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多