2013-09-04 3 views
0

У меня есть программа, которая опирается на несколько включенных файлов. Когда я определяю 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" 

Однако при переключении двух последних включает в себя, как показано ниже

#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> d: \ библиотеки \ tbb41 \ tbb41_20130613oss \ включать \ tbb \ task.h (765): ошибка C2059: синтаксическая ошибка: '{' 1> 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

+2

Все зависит от того, что находится внутри заголовков, особенно последних двух. Вам нужно будет посмотреть, какое из двух последних включает в себя, чтобы узнать, что такое зависимость. Может возникнуть проблема, если вы откроете 'task.h' и посмотрите на строку 765 и узнаете, какой из двух последних заголовков включает' task.h'. Является ли 'arrayfire.h' свой собственный заголовочный файл? Без раскрытия содержимого заголовков было бы почти невозможно, если бы кто-то здесь предоставил вам прямое решение. – lurker

+0

no arrayfire - это внешняя библиотека. – Alexey

+0

ОК, но мое другое предложение все еще применяется. Также проверьте документацию по библиотеке/заголовкам. Есть ли причина, по которой вам нужно обменивать заголовки? Там может быть известная зависимость, где они должны быть в том порядке, который действительно работает. – lurker

ответ

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 (и любое другое зло, которое оно может совершить) после его включения. Или, если возможно, убить его огнем и вместо этого использовать что-то меньшее.

+0

отличное понимание. Итак, как выглядит '#define group (...)' причинение вреда в дальнейшем? – Alexey

+0

@Alexey: Я добавил объяснение того, как он уничтожает объявление функции с тем же именем. –

 Смежные вопросы

  • Нет связанных вопросов^_^