考虑我在动态外部库中具有以下功能libExternal.dylib
:
void print(char* str)
{
// Changes the first char to 'a' and prints the string
*str = 'a';
printf("%s\n", str);
}
接下来,我有一个可执行文件来加载这个外部库并调用该函数(省略了错误检查):
int main(int argc, const char * argv[])
{
void* hLib = dlopen("libExternal.dylib", RTLD_LAZY | RTLD_LOCAL);
typedef void(*printFunc)(const char*);
printFunc func = (printFunc)dlsym(hLib, "print");
std::string test = "hello";
func(test.c_str());
dlclose(hLib);
return 0;
}
如您所见,库中定义的函数采用char*
as 参数。使用时dlsym
,我让它得到一个函数,它需要一个const char*
. 它有效!
我的问题是,这怎么可能?动态加载器忽略 const 类型?我真的无法在任何地方找到答案,所以请帮助我!:)
编辑: 我知道这段代码是错误的,我只是想了解这怎么可能。