gcc有弱符号/弱引用的概念,也就是自己写一个printf,链接的时候不会有重复定义的错误,自动链接我定义的这个函数
而vc的标准库函数看起来也是可以的:
int getchar()
{
return 1;
}
int main()
{
getchar();
return 0;
}
没有问题,编译链接会给我一个警告: warning C4273: 'getchar' : inconsistent dll linkage
但是我想自定义这样的链接覆盖,却不成功
_declspec(selectany) void f()
{
cout << "to be overwritten" << endl;
}
无论这个定义放在main函数所在的文件,还是单独建立一个dll的工程放进去,都提示错误:
Error 1 error C2496: 'f' : 'selectany' can only be applied to data items with external linkage
看起来VC提供的关键字_declspec(selectany)针对的是表示变量的符号,函数不行。
那么问题来了: vc自己的getchar()可以被我定义的覆盖,那么它的实现有什么特殊之处,使得可以被覆盖?
我看vc2013 crt的源代码,声明是:
_Check_return_ _CRTIMP int __cdecl getc(_Inout_ FILE * _File);
似乎也没有什么特殊之处啊
问题:
我究竟如何才能在VC里面实现,一个可以被使用者覆盖的dll导出函数呢? 我的目的是方便写测试代码的人。
thx
------解决思路----------------------
这个问题是使用者自己实现的。
如果他需要在替换静态库中函数,直接实现一个就可以了。
如果你使用的多个静态库中有同名的函数,那么link 会自己找一个,一般是第一个。
那么第二个就会被忽略。
此时 如果第二个库的其他函数被使用,那么这两个不同的同名函数就会被 Link ,此时就会报错。