Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > как выключить использование неймспейса


Автор: Homskiy 15.6.2008, 21:19
коротко. Есть проект написаный на С, его надо присобачить к проекту который пишется на C++, Builder 5. 
В проекте, который на С, в одном из хидеров есть строчки объявления типов и функции. Эти типы есесно используются в этом проекте. Но они конфликтуют с неймспесом System:
Код

Word   word[MAX_SENTENCE]; 
String * String_create()


ошибки: 
  • Ambiguity between 'Word' and 'System::Word'
  •  Ambiguity between 'String' and 'System::String'

Здесь - http://forum.vingrad.ru/forum/topic-216551.html - мне посоветовали задать этот вопрос в разделе Билдера, вот и спрашиваю. 
Как я понял, есть возможность отключить использование неймспейса System по умолчанию. В опциях проєкта ничего похожего не нашел. 


Я попробовал сделать такое:
Код

// это кусок из главного хидера ("link-includes.h"), в котором просто перечень всех хидеров которые используются в проекте
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
namespace LinkGrammar
{

#include "structures.h"
#include "api-structures.h"   // приведенные выше строчки находятся в этом хидере
#include "api.h"
#include "externs.h"
....
}


и в пустом проекте я добавил 
Код

#include "link-includes.h"

Оно откомпилилось нормально. 
Но когда я добавил вызов некоторых функций из этого проекта, то получил ошибки линкера примерного такого содержания:
Цитата

Unresolved external 'LinkGrammar::...' from ...


Хоть в параметрах проекта я указал директории либов и инклудов, оно их че-то не увидело... Потом я через Add to Project (shift+F11) добавил все си-шники проекта который я юзаю... После чего появилась ошибка в link-includes.h на строчку 
Код

namespace LinkGrammar


Цитата

Declaration syntax error


Вот... Надеюсь вы подскажите как сей гемор обойти.
ЗЫ: этот проект можно скачать здесь - http://www.link.cs.cmu.edu/link/
а здесь - http://www.link.cs.cmu.edu/link/api/index.html -  можно найти простой пример программы с использованием этого проекта, который я пытался скомпелировать... 

Автор: Lazin 15.6.2008, 21:45
паттерн адаптор тебе поможет... smile 

Автор: Homskiy 15.6.2008, 21:58
уу... Не хочу ошибиться, но паттерны это вроде типа шаблоны проектирования... И как оно тут поможет?.. 

Автор: Lazin 15.6.2008, 22:27
это паттерн, который позволяет преобразовать интерфейс, в данном случае все решается с помощью идиомы pimpl smile 

adapter.h

Код

//С++ интерфейс
class PublicInterface
{
 class impl;
 impl* pimpl_;
public:
 void f1(std::string c);
 void f2(unsigned v);
};


adapter.cpp

Код

#include "adapter.h"
#include "some_c_file.h"

class PublicInterface::impl
{
 void f1(std::string c) {
     ...используем ф-ии из some_c_file.h
 }
 void f2(unsigned v) {
     ...используем ф-ии из some_c_file.h
 }
};

void PublicInterface::f1(std::string c) {pimpl_->f1(c);}
void PublicInterface::f2(unsigned v) {pimpl_->f2(v);}


потом в программе подключаем adapter.h
если не делать интерфейс в виде класса, то можно еще проще, в хэдере объявить функции в срр реализовать их...

Автор: Homskiy 16.6.2008, 03:40
Спасибо, эта ошибка исчезла smile Только я не понимаю почему smile Надо будет разобраться... 
Теперь линкер матерится неистовым голосом... 
Мож поможет кто..
ошибка стандартная (Unresolved external symbol referenced from module), только я не пойму че она появляется - вроде все правильно делал.
Чужой проект находится в директории
D:\asdf\LINKGRAMPARSER\
его хидеры:
D:\asdf\LINKGRAMPARSER\include\
и си-шные файлы:
D:\asdf\LINKGRAMPARSER\src\
моя прога (с адаптером) находятся тута:
D:\asdf\first\

в этом линк-парсере есть один, главный, хидер - link-includes.h (он содержит перечень почти всех хидеров парсера), его я затулил в срр-шный файл адаптера, как в примере.  В функцию адаптера затулил то, что мне надо (пример с официального сайта этого парсера), и в основной проге проекта (обычная формочка с кнопкой и лейблом) вызываю эту функцию адаптера :
Код

//дальнейший код в онклик кнопочки
PublicInterface P;
char *s;
P.f1(s);  


в настройках проекта (в разделе директорий) я прописал инклуды: 
D:\asdf\LINKGRAMPARSER\include\
(+ на всяк случай)
D:\asdf\LINKGRAMPARSER\src\

и либы:
D:\asdf\LINKGRAMPARSER\src\

После этого линкер нифига не нашел. Тоесть к проекту не добавился ни один си-шный файл. Я добавил их через Add to Project. Ситуация тоже не очень поменялась. 
Открыв класс-эксплорер я смотрю что оно все структуры видит и все функции тоже. Но только декларейшены. А вот реализаций че-то не видит...
После этого я прошелся по всем си-шным файлам и там где было
Код

#include "link-includes.h"

поменял на (ну мож не видит - фиг его знает)
Код

#include "..\\LINKGRAMPARSER\\include\\link-includes.h"


Результат не изменился. 
Что я не так сделал или что надо еще сделать? Подскажите, плз. 

Автор: Lazin 16.6.2008, 07:41
нужно либо скомпилировать Си-шную библиотеку в lib и подключить к проекту, либо подключить к проекту все с файлы библиотеки
1-й вариант предпочтительней

Автор: Homskiy 17.6.2008, 02:00
фиг. не помогло. Решил запустить под turbo C. Но у того тоже линкер матюкается.. [censored 6], короче.

Автор: Homskiy 17.6.2008, 04:15
Ура!! Сделал! smile Надо было все си-шные файлы сипипи-шными сделать и поправить чуток smile 
Спасибо всем за внимание smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)