C++ 由于头文件中的语法错误而导致编译错误

C++ 由于头文件中的语法错误而导致编译错误,c++,compiler-errors,include,arrayfire,C++,Compiler Errors,Include,Arrayfire,我有一个程序,它依赖于几个包含文件。当我按照如下所示的顺序定义include时,程序可以很好地编译 #include <iostream> #include "opencv2/cvconfig.h" #include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/core/internal.hpp" // For TBB wrappers #include "array

我有一个程序,它依赖于几个包含文件。当我按照如下所示的顺序定义include时,程序可以很好地编译

#include <iostream>
#include "opencv2/cvconfig.h"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/core/internal.hpp" // For TBB wrappers
#include "arrayfire.h"

在第765行中,IDE抱怨
{
,说
错误:需要一个标识符

,这是由以下其中一个错误引起的:

这定义了一个类似宏的函数,该函数由宏参数列表替换;
group(a,b)
扩展为
a,b
,并且(更重要的是)
group()
扩展为空。由于宏不考虑语言级别的概念,如作用域,这会干扰后面的声明:

task_group_context* group () { return prefix().context; }
将其转换为

task_group_context* { return prefix().context; }
这不是一个有效的声明


修复方法是最后加入
“arrayfire.h”
,并小心在自己的代码中尝试使用哪些名称;或者在加入后加入
#undef group
(以及它可能犯下的任何其他罪恶)。或者,如果可能的话,用火杀死它,并改用不那么邪恶的名称。

这是由以下其中一种邪恶造成的:

这定义了一个类似宏的函数,该函数由宏参数列表替换;
group(a,b)
扩展为
a,b
,并且(更重要的是)
group()
扩展为空。由于宏不考虑语言级别的概念,如作用域,这会干扰后面的声明:

task_group_context* group () { return prefix().context; }
将其转换为

task_group_context* { return prefix().context; }
这不是一个有效的声明


修复方法是最后添加
“arrayfire.h”
,并注意在自己的代码中尝试使用哪些名称;或者
#取消组定义
(以及它可能犯下的任何其他罪行)在包含它之后。或者,如果可能的话,用火杀死它,并使用一些不那么邪恶的东西来代替。

这一切都取决于标题中的内容,特别是最后两个。您需要查看最后两个包含的一些内容,以了解依赖性是什么。如果打开
task.h
并查看第765行,可能会有线索,并且找出最后两个标题中的哪一个包含
task.h
。是
arrayfire.h
您自己的标题文件吗?如果不透露标题的内容,这里的人几乎不可能为您提供直接的解决方案。没有arrayfire是外部库。好的,但我的其他建议仍然适用。还要检查文档n在库/标题上。是否有需要交换标题的原因?可能存在一个已知的依赖项,它们必须按照实际工作的顺序排列。也许您可以向我们展示
tbb/task.h
的第765行,以及它周围的几行?这可能有助于我们猜测问题。@MikeSeymour,我编辑了我的问题,这取决于具体情况关于标题中的内容,特别是最后两个。您需要查看最后两个包含的部分内容,以了解依赖关系。如果打开
task.h
并查看第765行,可能会有线索,并找出最后两个标题中的哪一个包含
task.h
。是
arrayfire.h
您自己的标题文件?如果不显示标题的内容,这里的人几乎不可能为您提供直接的解决方案。没有arrayfire是一个外部库。好的,但我的其他建议仍然适用。还要检查库/标题的文档。是否有需要交换标题的原因?可能有已知的依赖项它们必须按实际工作的顺序排列。也许你可以给我们看一下
tbb/task.h
的第765行,以及它周围的几行?这可能有助于我们猜测问题所在。@MikeSeymour,我编辑了我的问题非常有洞察力。
如何定义组(…)
在后面的包含中导致邪恶?@Alexey:我添加了一个解释,说明它如何销毁同名函数的声明。非常有洞察力。那么
#如何定义组(…)
在后面的包含中导致邪恶?@Alexey:我添加了一个解释,说明它如何销毁同名函数的声明。
task_group_context* { return prefix().context; }