在不同的编译单元中处理相同符号的多个定义

问题描述

要使用volk.h,需要在一个编译单元中精确定义符号VOLK_IMPLEMENTATION

我有三个文件,main.cppapplication.cppapplication.h

这里是main.cpp

#include "application.h"

#include <stdexcept>

int main(int,char*[]) {
    Application application;
    try {
        application.run();
    } catch (std::runtime_error e) {
        printf("%s/n",e.what());
        return -1;
    }

    return 0;
}

这是application.h的最上部分(这是VOLK_IMPLEMENTATION出现的唯一文件):

#pragma once

#pragma warning(push,0)
#define VK_ENABLE_BETA_EXTENSIONS
#define VOLK_IMPLEMENTATION
#include "volk.h"
#pragma warning(pop)

最后,application.cpp仅在最顶部包含application.h,无论如何,其他都没关系。

上面的代码无法编译。它声称某些volk符号已经被定义。如果我从application.h中删除了VOLK_IMPLEMENTATION,那么它就不会编译,因为根本没有定义符号。

但是,如果我将volk包含项移至main.cpp,则一切正常。但是,我不需要在main中添加volk,也不想在其中包含它。

为什么会这样?

main.cpp一个编译单元,另一个是application.h/cpp,但是由于application.h中包含main.cpp,所以它被添加到两个编译单元中,因此添加了{{1} }两次定义了volk.h?如何处理呢?

每次我认为我想出了包含系统时,都会发生类似的情况。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)