静态函数是否隐藏了具有相同名称的非静态函数?

时间:2014-02-25 15:20:51

标签: c++ c static

我试着查看,但没有找到它。所以这就是问题:

C / C ++中的静态函数可用于“使它们对外部世界不可见”。很好,当在两个不同的编译单元(.c文件)中有两个同名的静态函数时,它确保我称之为正确的。 但是,如果在项目或库中某处存在同名的非静态函数,我还可以确定调用本地静态函数吗?也就是说,静态函数是否在本地隐藏非静态的?

当然我可以测试它(我做过)但我想知道这种行为在C / C ++中是否有固定的定义。感谢。

编辑:简化的示例代码,导致我出现意外行为。 问题是关于问题的解决方法(假设我无法更改库)。

在mylib.c中:

#include "mylib.h"
int send(void * data, int size);
...
int send(void * data, int size) {
    return send_message(queueA, data, size);
}
void libfunc(void) {
    send(str, strlen(str));
}

在mylib.h中:

// only libfunc is declared here
void libfunc(void);

在myprog.c中:

#include "mylib.h"
int send(void * data, int size);
...
int send(void * data, int size) {
    return send_message(queueB, data, size);
}
void progfunc(void) {
    // expected to send a message to queueB
    // !!! but it was sent to queueA instead !!!
    send(str, strlen(str));
}

已编译mylib.c + further files - > mylib.a

已编译myprog.c - > myprog.o

已关联myprog.o + mylib.a - > myprog

2 个答案:

答案 0 :(得分:4)

您将收到编译错误,因为函数具有默认外部链接,因此新的static函数将导致链接说明符冲突。

如果看不到非static函数的声明,则会调用static函数:

void foo();            //external linkage
static void foo() {};  //internal linkage and error

答案 1 :(得分:1)

它不会隐藏在同一范围内声明的具有相同名称的函数。但是,您可能没有声明具有内部和外部链接的相同签名的函数。