2014-12-30 3 views
1

У меня возникают проблемы при написании приложения в C++. У меня есть два проекта. Проект A - это обычный проект C++, проект B - проект C++ с поддержкой clr. Проект А содержит классы, в которых используются заголовки из структуры LLVM. Проект B содержит управляемые обертки для некоторых классов проекта A. Могу ли я использовать классы из проекта A в проекте B без включения их заголовков?C++ заголовки между проектами

Причина в этом. Когда я включаю заголовки классов из проекта A в проект B, мне нужно указать также библиотеки фреймворков, которые использует этот заголовок из проекта A, но структура LLVM не может взаимодействовать с поддержкой clr. Я не могу переместить фреймворк из заголовка в файл cpp. Как я могу это решить?

+2

Вы должны использовать заголовки - иначе как ваш исходный файл знает, как использовать каждый класс? Я думаю, что единственный способ решить эту проблему - использовать препроцессор. –

+1

Пока вы не должны использовать LLVM и clr вместе, вы можете использовать форвардные объявления. Заголовки просто объявляют переменные и функции, которые присутствуют в другом исходном файле, и помещают их в класс, в который заголовок включен, поэтому код знает о существовании этих функций и переменных. Если, конечно, заголовки не массивны, и вы не хотите пересылать объявление всем или создавать другой заголовок, который не включает несовместимые заголовки. – tom

ответ

0

Вы можете использовать до тех пор, пока вы не используете шаблоны в проекте A, которые зависят от заголовков LLVM. Вы всегда можете пересылать декларацию типов, которые вы используете в заголовках заголовков проекта, и включать фактические заголовки в файлы cpp.

Скажите, что существует тип, который вы хотите использовать под названием llvm_type, который является классом, определенным библиотеками компилятора LLVM. В projectA.h вы можете сделать так:

class llvm_type; 

class MyAPrjClass { 
public: 
    void myMethod (llvm_type x, int y); 
} 

Затем в projectA.cpp вы включаете заголовок LLVM:

#include <llvm_type.h> 

void MyAPrjClass:: myMethod (llvm_type x, int y) 
{ 
    // Define your method using the llvm_type here. 
} 

То же самое может быть сделано для структур, контейнеров и других типов до тех пор, как вы вперед declarate их. Предположим, например, вы хотите использовать std::vector<int>, который является частью компилятора LLVM. В этом случае вы объявите в вашем заголовке что-то вроде class VectorInt; определения прототипов и в вашем CPP вы пишете:

#include <vector> 
typedef std::vector<int> VectorInt; 

и использовать его в своих определениях методов.

Что вы не можете сделать, это определить классы шаблонов или методы, зависящие от заголовков LLVM, потому что вам необходимо определить методы в тех же заголовках, которые будут связаны с пониманием реализации импортированных типов.

+1

Ну, я попробовал это еще до того, как задал вопрос. Тем не менее, я попробовал еще раз, но теперь это привело меня к правильному пути. Кажется, что LLVM очень строгий в том числе. Некоторые из моих включений должны быть в заголовочном файле (все заголовки, которые не предназначены для LLVM, а не для пользовательских классов), некоторые из них должны быть в файле cpp (все заголовки LLVM и все пользовательские классы), и я не могу использовать windows.h , По какой-то причине он сталкивается с одним (да только одним) ядром LLVM-файла. Спасибо за ваш совет, вы действительно помогли мне решить эту проблему. – benderto

+0

Добро пожаловать. Удачи. –

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