Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ссылки VS портабельность. 
:(
    Опции темы
ShadowsInRain
Дата 4.3.2012, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 4.3.2012

Репутация: нет
Всего: нет



Предыстория.
Я пишу хост для плагинов. Когда плагин загружен, он получает указатель на таблицу функций. Иногда мне нужно построить "текучий интерфейс", типа такого:
Код
typedef struct{} *ht_MenuNode;
struct iMenuNode
{
    struct iEditor
    {
        typedef iEditor *t_loopback;

        t_loopback (*SetCaption)  (const char *);
        t_loopback (*AddChild)    (ht_MenuNode Child);
        // etc ...

        ht_MenuNode (*GetHandle)();
    };

    iEditor * (*New)  ();
    iEditor * (*Edit) (ht_MenuNode);
    // ...
};


По привычке я использую указатели, но в этом случае мне хотелось бы использовать ссылки, ибо
1. Функции этого интерфейса никогда не вернут невалидный указатель на iEditor.
2. По очевидным причинам сохранять указатель на iEditor недопустимо.
3. Нет необходимости поддерживать совместимость с Си.
4. Я не прочь сэкономить немного времени при наборе длинных текстов.

Код
iEditor & (*New)  ();
iEditor & (*Edit) (ht_MenuNode);


Но:
1. Под одной и той же платформой плагины могут быть скомпилированы разными компиляторами.
2. Я не видел аналогичных интерфейсов, где бы использовались ссылки.
Поэтому меня терзают сомнения.

Собственно вопрос.
Передача-по-ссылке и возврат-по-ссылке — это портабельные приёмы?
Прописано ли это как-либо в стандарте?

До этого я задавал вопрос на стакЪоверфлов, но ответов вообще не получил, только смутные комментарии.
PM MAIL   Вверх
boostcoder
Дата 4.3.2012, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



ссылка - это псевдоним.
таким образом, ты привяжешь себя к ABI.
http://liveworkspace.org/code/c70daef6968c...b0a93eeca719768

в плагинах не зря используются указатели и простые типы.
PM WWW   Вверх
newbee
Дата 4.3.2012, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



В интерфейсе плагина лучше использовать чистый C89.


--------------------
You're face to face
With man who sold the world
PM   Вверх
ShadowsInRain
Дата 4.3.2012, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 4.3.2012

Репутация: нет
Всего: нет



boostcoder, но на стек то кладётся адрес объекта, а не псевдоним.
http://liveworkspace.org/code/4bf894c0036f...c1b6070a8ba1b57
Поэтому мне интересно — определено ли это стандартом, или отдано на волю компилятора.


newbee, возможно это было хорошо в 89м году. В 2012м я хочу пронстранства имён и короткие имена типов.
PM MAIL   Вверх
newbee
Дата 4.3.2012, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Цитата(ShadowsInRain @  4.3.2012,  22:37 Найти цитируемый пост)
newbee, возможно это было хорошо в 89м году. В 2012м я хочу пронстранства имён и короткие имена типов. 
Хотеть то ты можешь чего угодно, я же не против, но заманглеными интерфейсами торчать наружу должно быть стыдно даже в 2012-ом.



--------------------
You're face to face
With man who sold the world
PM   Вверх
ShadowsInRain
Дата 4.3.2012, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 4.3.2012

Репутация: нет
Всего: нет



newbee, наружу там торчит только одна функция, которая принимает указатель на основной интерфейс.
PM MAIL   Вверх
boostcoder
Дата 4.3.2012, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(ShadowsInRain @  4.3.2012,  21:37 Найти цитируемый пост)
но на стек то кладётся адрес объекта, а не псевдоним.
http://liveworkspace.org/code/4bf894c0036f...c1b6070a8ba1b57

не понял аналогии с примером..
в примере, ты передаешь адрес.

PM WWW   Вверх
ShadowsInRain
Дата 4.3.2012, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 4.3.2012

Репутация: нет
Всего: нет



boostcoder, func_b принимает ссылку.
PM MAIL   Вверх
boostcoder
Дата 4.3.2012, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(ShadowsInRain @  4.3.2012,  22:25 Найти цитируемый пост)
 func_b принимает ссылку. 

ах да)

ну не знаю.. выглядит правдоподобно, хоть и необычно.
мои познания в плагинах исчерпаны...
PM WWW   Вверх
mes
Дата 4.3.2012, 23:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



если я правильно понял вопрос, то 
 ссылка в аргументах функции лишь гарантированный не нуль указатель.. 
 т.е. при взаимодействие с си используется передача указателя )



--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0848 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.