强制实现/定义函数声明

时间:2013-11-25 19:18:58

标签: c++ c header implementation

假设我的标题应该在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

(因为内联修饰符允许多个定义)。但是怎么样?

2 个答案:

答案 0 :(得分:0)

首先,C也有staticinline

第二,怎么样......

  1. 记录这些功能将由用户实施?

  2. 在运行时检查功能的可用性并报告错误/在无法找到时抛出异常? dlsym()(我假设您正在使用dlopen() API,这是真的吗?)当它找不到符号时会返回空指针。

  3. 如果你真的想要链接时间失败,那么你可以尝试使用这些函数(如果你没有&#,可以调用它们,或者将它们的名字分配给volatile函数指针39;不要过早地进行副作用等。)

答案 1 :(得分:0)

C允许完全相同的static inline函数。但是编译器可能会优化它,因为你的assert被触发,因此下面的代码被标记为无法访问。