Моя ситуация следующая:
Я пишу набор инструментов, который генерирует две библиотеки.Первый (A) имеет все функции и типы данных и может использоваться в чистом приложении C ++;второй (B) - это интерфейс к MATLAB.Программа на чистом C ++ будет скомпилирована с
g++ $(FLAGS) C.cpp $(MOREFLAGS) -lA
, тогда как программа MATLAB будет скомпилирована с B, связанным после A, то есть
mex $(FLAGS) C.cpp $(MOREFLAGS) -lA -lB
Теперь я хотел бы использовать указатель на функцию (myexit
) для вызова std::exit()
для приложений на чистом C ++ и mex_exit()
(который вызывает mexErrMsgTxt()
) для приложений MATLAB.Следуя руководству по указателям на функции, я написал что-то вроде приведенных ниже фрагментов (на самом деле все находится в пространстве имен, но для краткости я это исключил).
//A.hpp
#ifndef __A
#define __A
extern void (*myexit)(int);
...
#ifdef mex_h /* defined in mex.h */
#include "B.hpp"
#endif /* mex_h */
#endif /* __A */
//A.cpp
#include "A.hpp"
void (*myexit)(int) = &std::exit;
//B.hpp
#ifndef __B
#define __B
#include <mex.h>
#include "A.hpp"
...
void mex_exit(int);
#endif /* __B */
//B.cpp
#include <mex.h>
#include "A.hpp"
void mex_exit(int err) {mexPrintf("Error code %d\n",err); mexErrMsgTxt("...");}
//void (*myexit)(int) = &mex_exit; // <- I want a line like this to override the line in A.cpp
То, что у меня есть выше, похоже, работает длячистого кода на C ++, и я обнаружил, что могу получить правильное поведение для кода MATLAB, если я включу строку myexit = &mex_exit;
в C.cpp, однако я хочу, чтобы это поведение было просто из-за наличия #include <mex.h>
и #include "A.hpp"
в C.cpp иссылка на B (т. е. пользователь не должен включать эту строку).
Возможно ли это?Если так, то как?