【发布时间】:2018-04-24 20:36:37
【问题描述】:
我在职业生涯中使用的代码是用 C++ 编写的,并使用适用于 Visual Studio 15 的 DevEnv wrap (1.61) 构建。
大部分工作是通过一系列#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 类型的值代替 OUTPUT)
有没有办法让编译器报告语法错误来自#included 的文件?
【问题讨论】:
-
这些包含的数据从何而来?或许写个能生成包含文件的 import util 会更好?
-
可能缺少的分号实际上存在于真实代码中?
-
哇,真可怕。为“The Preprocessor is Evil”加注,恭喜!
-
啊,更正了缺少的分号。所有结构的声明和定义都在头文件中。源文件循环遍历结构以执行一些初始化(有时创建对象)
-
这个问题与嵌套的#include 指令无关。它与嵌套的 {{{}}} 结构有关。如果你忘记了其中一个大括号,编译器通常无法知道,直到嵌套结构的最后,即使这样,也无法知道忘记了哪个大括号。
标签: c++ visual-studio-2017 devenv