假设我的标题应该在C和C ++中都有效。 此标头包含程序必须定义的一些函数,例如:
EXPORTED void * STD_API GetSymbol(CProject * p, char * s);
我如何确保在某处实际定义这些功能?即使项目实际上没有编译,它也是无效的,因为这些函数将在运行时由另一个模块查找(它将被编译为模块/ dll / dylib /等)。
我唯一能想到的是在某处使用定义,也许是在函数调用中。但是,这需要在标题中执行函数,我们都知道这将导致多个定义。
在C ++中你可能会躲过这样的黑客攻击:
#ifdef __cplusplus
static inline void _impcheck()
{
assert(0 && "_impcheck called.");
GetSymbol(NULL, NULL);
}
#endif
(因为内联修饰符允许多个定义)。但是怎么样?
答案 0 :(得分:0)
首先,C也有static
和inline
。
第二,怎么样......
记录这些功能将由用户实施?
在运行时检查功能的可用性并报告错误/在无法找到时抛出异常? dlsym()
(我假设您正在使用dlopen()
API,这是真的吗?)当它找不到符号时会返回空指针。
如果你真的想要链接时间失败,那么你可以尝试使用这些函数(如果你没有&#,可以调用它们,或者将它们的名字分配给volatile
函数指针39;不要过早地进行副作用等。)
答案 1 :(得分:0)
C允许完全相同的static inline
函数。但是编译器可能会优化它,因为你的assert
被触发,因此下面的代码被标记为无法访问。