假设我有一个可以在 C 和 C++ 中工作的 header 。 这个头文件包含一些程序必须定义的函数,例如:
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也有static
和inline
。
其次,怎么样...
记录功能将由用户实现?
在运行时检查函数的可用性并在找不到函数时报告错误/抛出异常?
dlsym()
(我假设您正在使用dlopen()
API,是这样吗?)当找不到符号时将返回空指针。如果您真的想要链接时失败,那么您可以尝试使用函数(调用它们,或者将它们的名称分配给
volatile
函数指针,如果你不希望过早地执行副作用等)
关于c++ - 强制执行/定义函数声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20201379/