【问题标题】:Force implementation/definition of function declaration强制实现/定义函数声明
【发布时间】:2013-11-25 19:18:57
【问题描述】:

假设我有一个可以在 C 和 C++ 中工作的头文件。 这个头文件包含了一些程序必须定义的函数,例如:

EXPORTED void * STD_API GetSymbol(CProject * p, char * s);

我如何确保这些函数实际上是在某个地方定义的?即使项目实际编译没有,也是无效的,因为这些函数会在运行时被另一个模块查找(它要编译为模块/dll/dylib/whatever)。

我唯一能想到的就是在某处使用该定义,也许是在函数调用中。但是,这需要在 header 中实现一个函数,我们都知道这会导致多个定义。

在 C++ 中,您可能可以通过这样的 hack 逃脱:

#ifdef __cplusplus

    static inline void _impcheck()
    {
        assert(0 && "_impcheck called.");

        GetSymbol(NULL, NULL);
    }

#endif

(因为内联修饰符允许多个定义)。但是c呢?

【问题讨论】:

    标签: c++ c header implementation


    【解决方案1】:

    首先,C 也有staticinline

    其次,怎么样...

    1. 记录功能将由用户实现?

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

    3. 如果你真的想要链接时失败,那么你可以尝试使用函数(调用它们,或者将它们的名称分配给volatile函数指针,如果你不想要过早执行的副作用等)

    【讨论】:

    • 很好,我不知道它是否真的是受支持的功能(但它需要 C99 iirc?) - 我认为它具有与 C++ 中相同的“功能”。 1. 我这样做。 2. 我也这样做。我还没有完全移植到 mac,但是我很可能会使用 dl api。 3. 我不会那样做 :) 我只是认为这是避免编译过程中常见错误的好方法(如果可以轻松实现的话)。
    • @Shaggi 是的,inline 需要 C99“或更高版本”。
    【解决方案2】:

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

    【讨论】:

    • 希望编译无论如何都会失败。我会想办法的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 2023-03-12
    • 1970-01-01
    • 2018-08-09
    • 2014-02-06
    • 1970-01-01
    相关资源
    最近更新 更多