Re: Порядок выполнения функций сторонего API
От: remark Россия http://www.1024cores.net/
Дата: 25.08.10 11:13
Оценка: 6 (1)
Здравствуйте, ankorol, Вы писали:

A>Добрый день. Задался ,на мой взгляд, интересным вопросом — допустим мы пишем библиотеку интерфейс которой N функций. Можем ли мы выявлять ошибки очередности вызова функций из библиотеки на этапе компиляции. (хотя бы в пределах одной еденицы трансляции).

A>Например:
A>RunSomeUsefulLibFunc(); //ошибка: Init не вызывается в этой еденице трансляции
A>InitLib();

Тебе сюда:
http://rsdn.ru/forum/cpp/2311642.aspx
Автор: remark
Дата: 21.01.07


Это можно портировать и на другие компиляторы, благодаря этому:
http://rsdn.ru/forum/cpp/2337951.1.aspx
Автор: remark
Дата: 06.02.07

(правда на последних gcc это не проверялось)


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: Порядок выполнения функций сторонего API
От: Sni4ok  
Дата: 25.08.10 14:08
Оценка: 1 (1)
Здравствуйте, ankorol, Вы писали:

A>RunSomeUsefulLibFunc(); //ошибка: Init не вызывается в этой еденице трансляции

A>InitLib();

сделайте прототипы вида
void* InitLib();
RunSomeUsefulLibFunc(void*);


тогда точно вызывать будут правильно
Re: Порядок выполнения функций сторонего API
От: Pzz Россия https://github.com/alexpevzner
Дата: 27.08.10 18:53
Оценка: 1 (1)
Здравствуйте, ankorol, Вы писали:

A>Добрый день. Задался ,на мой взгляд, интересным вопросом — допустим мы пишем библиотеку интерфейс которой N функций. Можем ли мы выявлять ошибки очередности вызова функций из библиотеки на этапе компиляции. (хотя бы в пределах одной еденицы трансляции).


Вы можете сделать так, что если функция F1() должна вызываться до вызова F2(), то F1() возвращает нечто, необходимое в качестве параметра для F2().

A>RunSomeUsefulLibFunc(); //ошибка: Init не вызывается в этой еденице трансляции

A>InitLib();

Например, InitLib() возвращает некий LibInstanceHandle, необходимый для вызова каждой последующей функции.

Ну и как всегда, со свойственными C++ изяществом и мощью можно сделать этот Handle классом, не позволяющим сконструировать его никак иначе, кроме как через вызов InitLib()

Но если InitLib() сам по себе не требует от пользователя никаких параметров, я бы не мучал пользователя, и сделал бы автоматическую инициализацию. А InitLib() из API вовсе бы убрал.
Re[2]: Порядок выполнения функций сторонего API
От: Кодт Россия  
Дата: 25.08.10 12:51
Оценка: +1
Здравствуйте, hotdox, Вы писали:

H>Можно нагородить несколько типов:

H>class TNotInitedLib с единственным методом InitLib возвращаиющим TInitedLib
H>TInitedLib с методом DoFisrt() возвращющим TLibAfterFirst и так далее

H>Если руками все писать лень можно похитрить с шаблонами и наследованием


Чую, мы сейчас изобретём монаду IO и уникальные типы...
Перекуём баги на фичи!
Порядок выполнения функций сторонего API
От: ankorol Украина  
Дата: 25.08.10 10:57
Оценка:
Добрый день. Задался ,на мой взгляд, интересным вопросом — допустим мы пишем библиотеку интерфейс которой N функций. Можем ли мы выявлять ошибки очередности вызова функций из библиотеки на этапе компиляции. (хотя бы в пределах одной еденицы трансляции).
Например:
RunSomeUsefulLibFunc(); //ошибка: Init не вызывается в этой еденице трансляции
InitLib();

Спасибо.
Re: Порядок выполнения функций сторонего API
От: hotdox  
Дата: 25.08.10 12:14
Оценка:
Здравствуйте, ankorol, Вы писали:

A>Добрый день. Задался ,на мой взгляд, интересным вопросом — допустим мы пишем библиотеку интерфейс которой N функций. Можем ли мы выявлять ошибки очередности вызова функций из библиотеки на этапе компиляции. (хотя бы в пределах одной еденицы трансляции).

A>Например:
A>RunSomeUsefulLibFunc(); //ошибка: Init не вызывается в этой еденице трансляции
A>InitLib();

A>Спасибо.


Можно нагородить несколько типов:
class TNotInitedLib с единственным методом InitLib возвращаиющим TInitedLib
TInitedLib с методом DoFisrt() возвращющим TLibAfterFirst и так далее

Если руками все писать лень можно похитрить с шаблонами и наследованием
Re[2]: Порядок выполнения функций сторонего API
От: Кодт Россия  
Дата: 26.08.10 17:28
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>сделайте прототипы вида

S>
S>void* InitLib();
S>RunSomeUsefulLibFunc(void*);
S>


S>тогда точно вызывать будут правильно


Советчик, тоже мне. Очевидно же, что будут вызывать RunSomeUsefulLibFunc(NULL)

Надо так
typedef struct tagInitLibHandle &InitLibHandle; // для си - придётся *InitLibHandle и смириться.
InitLibHandle InitLib();
void RunSomeUsefulLibFunc(InitLibHandle h);
Перекуём баги на фичи!
Re[3]: Порядок выполнения функций сторонего API
От: Sni4ok  
Дата: 26.08.10 18:36
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Советчик, тоже мне. Очевидно же, что будут вызывать RunSomeUsefulLibFunc(NULL)


пользователю же не будет известно, что суть функции- свободная функция не зависящая от аргумента, а если сильно хочется- то можно специально и упасть, если аргумент неверный. Другое дело, что при вызове InitLib() наверно что-то инициализируется где-то глобально, так это что-то можно обернуть в структурку- которую и инициализировать, и указатель на которую возвращать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.