使用许多嵌套的#include语句排除编译器错误

时间:2018-04-24 20:36:37

标签: c++ visual-studio-2017 devenv

我为我的职业生涯所使用的代码是用C ++编写的,并使用DevEnv wrap(1.61)为Visual Studio 15构建。

大部分工作是通过一系列最终嵌套的#include语句来配置结构,例如:

//ObjRTC.h
struct OBJ_RTC
{
    OBJ_SETTINGS    settings;
    OBJ_ESTOPS      emergencyStops[maxEstops];
    OBJ_MACHINES    machines[maxMachines];
    OBJ_FOO         bar[maxFooBars];
};

//ObjMachines.h
struct OBJ_MACHINES
{
    bool    inUse;
    INPUTS  inputDevices[maxInputDevices];
    OUTPUTS outputDevices[maxOutputDevices];
};

这些结构在其他文件中进一步定义,我们开始在'def'文件中声明值。

// DefRTC.h
OBJ_RTC RealTimeController = {
    #include "DefSettings.h"
    #include "DefEstops.h"
    #include "DefMachines.h"
    #include "DefFoo.h"
};

// DefMachines.h
{
    {
        true,
        { /* list of inputs */ },
        { /* list of outputs */ },
    },
    {
        true,
        { /* list of inputs */ },
        { /* list of outputs */ },
    },
    {
        true,
        { /* list of inputs */ },
        { /* list of outputs */ },
    },
},

如果声明文件中存在语法问题,则在编译期间通常只会报告来自DefRTC.h的最后一行。

我知道我可以开始复制文件并粘贴#include行,这是我在尝试解决问题时所做的(INPUT类型的值已配置为代替{{1} }})

有没有办法让编译器报告语法错误来自OUTPUT文件?

1 个答案:

答案 0 :(得分:0)

您可以预处理.c文件,该文件会产生编译错误并编译该预处理文件 然后错误/警告将始终引用该文件中的一行 然后,您可以通过插入经过预处理的书签来识别行所来自的原始文件。书签基本上只是在每个文件的第一行中注明文件名 如何使预处理器幸存的书签(因为评论和预处理定义当然会丢失)?

写一个typedef,它不消耗任何资源(除了名称空间使用) 它仍然存在于人眼阅读预处理文件:

typedef int BookmarkFilename1_h_Start;

为了方便导航,请在每个标题的末尾添加另一个书签:

typedef int BookmarkFilename1_h_End;

然后,为了在标题中找到行号(如果它很长),从pp文件中的错误行号中减去书签的行号(在预处理文件中)。然后在原始标题中添加书签的行号 除了使用多行宏(\延续),这应该给你文件名和原始行号。

如果您的工具链/建筑环境抱怨使用int,请将其替换为任何其他已接受的可见类型。

对于可疑线路的重点识别,您可以在靠近嫌疑人的附近线路中添加书签。只要确保你适当地超出任何范围,即在一个使typedef没问题的地方。