C++ rand()函数的动态链接器错误

C++ rand()函数的动态链接器错误,c++,linux,c++11,dynamic-linking,C++,Linux,C++11,Dynamic Linking,我之前已经问过一个问题,但是再次提到下面的代码 #include <iostream> using std::cout; using std::endl; #include <dlfcn.h> int rand() throw() { // get the original rand() function static auto original_rand = (decltype(&rand)) dlsym(RTLD_NEXT, "rand")

我之前已经问过一个问题,但是再次提到下面的代码

#include <iostream>
using std::cout;
using std::endl;
#include <dlfcn.h>

int rand() throw() {

    // get the original rand() function
    static auto original_rand = (decltype(&rand)) dlsym(RTLD_NEXT, "rand");

    cout << "Call made to rand()" << endl;
    return original_rand();
}
为什么会发生这种情况?链接器如何知道这只是我自己声明的另一个rand()函数,而不是现有版本的
rand()
。后者没有任何异常规范。在代码中,您试图重载
rand()
,但签名与
中的签名相同,除了异常说明符(它不是函数类型的一部分,因此不能单独重载),因此会出现编译时错误(不是问题中提到的链接器错误)

如果您想知道函数“代码> RAND())/Calp>静默包含的内容在全局命名空间中也可见(不可见,仅作为代码> STD::RAND 正如您所期望的那样),那是因为C库函数经常通过直接的

导入标准C++头文件中。
// <new_cpp_header>
#include <old_c_header.h> 
因此,函数在全局名称空间以及
名称空间std中结束。在我看来,这不是一个很好的实践,但现在大多数编译器都是这样做的

例如,
文件具有:

// <cstdio>
#include <stdio.h>
namespace std
{
    using printf;
    // ...
}
//
#包括
名称空间标准
{
使用printf;
// ...
}
因此,
printf
std::printf
都是可见的,即使您只包含
(而不是
)。

您的一个头文件(
在我的例子中)静默地包含
,其中包含函数。后者没有任何异常规范。在代码中,您试图重载
rand()
,但签名与
中的签名相同,除了异常说明符(它不是函数类型的一部分,因此不能单独重载),因此会出现编译时错误(不是问题中提到的链接器错误)

如果您想知道函数“代码> RAND())/Calp>静默包含的内容在全局命名空间中也可见(不可见,仅作为代码> STD::RAND 正如您所期望的那样),那是因为C库函数经常通过直接的

导入标准C++头文件中。
// <new_cpp_header>
#include <old_c_header.h> 
因此,函数在全局名称空间以及
名称空间std中结束。在我看来,这不是一个很好的实践,但现在大多数编译器都是这样做的

例如,
文件具有:

// <cstdio>
#include <stdio.h>
namespace std
{
    using printf;
    // ...
}
//
#包括
名称空间标准
{
使用printf;
// ...
}

因此,
printf
std::printf
都是可见的,即使您只包括
(而不是
)。

链接器一点线索也没有,但您没有走那么远。这条消息来自编译器,它说你的
rand
看起来不像它知道的另一个
rand
。链接器一点线索都没有,但你没有走那么远。该消息来自编译器,表示您的
rand
看起来不像它知道的另一个
rand