Добрый день. Задался ,на мой взгляд, интересным вопросом — допустим мы пишем библиотеку интерфейс которой N функций. Можем ли мы выявлять ошибки очередности вызова функций из библиотеки на этапе компиляции. (хотя бы в пределах одной еденицы трансляции).
Например:
RunSomeUsefulLibFunc(); //ошибка: Init не вызывается в этой еденице трансляции
InitLib();
Здравствуйте, ankorol, Вы писали:
A>Добрый день. Задался ,на мой взгляд, интересным вопросом — допустим мы пишем библиотеку интерфейс которой N функций. Можем ли мы выявлять ошибки очередности вызова функций из библиотеки на этапе компиляции. (хотя бы в пределах одной еденицы трансляции). A>Например: A>RunSomeUsefulLibFunc(); //ошибка: Init не вызывается в этой еденице трансляции A>InitLib();
Здравствуйте, ankorol, Вы писали:
A>Добрый день. Задался ,на мой взгляд, интересным вопросом — допустим мы пишем библиотеку интерфейс которой N функций. Можем ли мы выявлять ошибки очередности вызова функций из библиотеки на этапе компиляции. (хотя бы в пределах одной еденицы трансляции). A>Например: A>RunSomeUsefulLibFunc(); //ошибка: Init не вызывается в этой еденице трансляции A>InitLib();
A>Спасибо.
Можно нагородить несколько типов:
class TNotInitedLib с единственным методом InitLib возвращаиющим TInitedLib
TInitedLib с методом DoFisrt() возвращющим TLibAfterFirst и так далее
Если руками все писать лень можно похитрить с шаблонами и наследованием
Здравствуйте, hotdox, Вы писали:
H>Можно нагородить несколько типов: H>class TNotInitedLib с единственным методом InitLib возвращаиющим TInitedLib H>TInitedLib с методом DoFisrt() возвращющим TLibAfterFirst и так далее
H>Если руками все писать лень можно похитрить с шаблонами и наследованием
Чую, мы сейчас изобретём монаду IO и уникальные типы...
Здравствуйте, Кодт, Вы писали:
К>Советчик, тоже мне. Очевидно же, что будут вызывать RunSomeUsefulLibFunc(NULL)
пользователю же не будет известно, что суть функции- свободная функция не зависящая от аргумента, а если сильно хочется- то можно специально и упасть, если аргумент неверный. Другое дело, что при вызове InitLib() наверно что-то инициализируется где-то глобально, так это что-то можно обернуть в структурку- которую и инициализировать, и указатель на которую возвращать.
Здравствуйте, ankorol, Вы писали:
A>Добрый день. Задался ,на мой взгляд, интересным вопросом — допустим мы пишем библиотеку интерфейс которой N функций. Можем ли мы выявлять ошибки очередности вызова функций из библиотеки на этапе компиляции. (хотя бы в пределах одной еденицы трансляции).
Вы можете сделать так, что если функция F1() должна вызываться до вызова F2(), то F1() возвращает нечто, необходимое в качестве параметра для F2().
A>RunSomeUsefulLibFunc(); //ошибка: Init не вызывается в этой еденице трансляции A>InitLib();
Например, InitLib() возвращает некий LibInstanceHandle, необходимый для вызова каждой последующей функции.
Ну и как всегда, со свойственными C++ изяществом и мощью можно сделать этот Handle классом, не позволяющим сконструировать его никак иначе, кроме как через вызов InitLib()
Но если InitLib() сам по себе не требует от пользователя никаких параметров, я бы не мучал пользователя, и сделал бы автоматическую инициализацию. А InitLib() из API вовсе бы убрал.