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

时间:2013-09-04 17:51:40

标签: c++ compiler-errors include arrayfire

我有一个依赖于几个包含文件的程序。当我按照下面显示的顺序定义包含时,程序编译正常。

#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"

但是,当我切换最后两个包含如下所示

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

我收到编译错误:

  

1&gt; d:\ libraries \ tbb41 \ tbb41_20130613oss \ include \ tbb \ task.h(765):错误   C2059:语法错误:'{'   1&gt; d:\ libraries \ tbb41 \ tbb41_20130613oss \ include \ tbb \ task.h(765):错误   C2334:'{'之前的意外令牌;跳过明显的功能   体

这是意料之外的,我想解决它。所有包含都来自库(OpenCV和ArrayFire)。关于可能是什么原因以及如何解决这个问题的任何建议?

修改以下是 task.h 的相关部分:

759 #if __TBB_TASK_GROUP_CONTEXT
760    //! This method is deprecated and will be removed in the future.
761    /** Use method group() instead. **/
762    task_group_context* context() {return prefix().context;}
763
764    //! Pointer to the task group descriptor.
765    task_group_context* group () { return prefix().context; }
766 #endif /* __TBB_TASK_GROUP_CONTEXT */

在第765行,IDE抱怨{,说Error: expected an identifier

1 个答案:

答案 0 :(得分:4)

这是由ArrayFire headers之一中的以下邪恶引起的:

#define group(...)  __VA_ARGS__

这定义了一个类似函数的宏,它被宏参数列表取代; group(a,b)扩展为a,b,(更重要的是,此处)group()扩展为空。由于宏不尊重范围等语言级概念,因此会干扰后面的声明:

task_group_context* group () { return prefix().context; }

将其转换为

task_group_context* { return prefix().context; }

这不是有效的声明。

修复是最后包含"arrayfire.h",并且要小心您尝试在自己的代码中使用哪些名称;在包括它之后,或#undef group(以及它可能犯下的任何其他邪恶)。或者,如果可能的话,用火杀死它并使用不那么邪恶的东西。