当前位置: 代码迷 >> VC/MFC >> 能否让小弟我的dll当中导出的函数,被使用者覆盖
  详细解决方案

能否让小弟我的dll当中导出的函数,被使用者覆盖

热度:69   发布时间:2016-05-02 03:24:24.0
能否让我的dll当中导出的函数,被使用者覆盖?
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 ,此时就会报错。
  相关解决方案