C++ 静态函数是否隐藏同名的非静态函数?

C++ 静态函数是否隐藏同名的非静态函数?,c++,c,static,C++,C,Static,我试着查找这个,但在任何地方都找不到。所以问题是: C/C++中的静态函数可用于“使它们对外部世界不可见”。很好,当在两个不同的编译单元(.c文件)中有两个相同的命名静态函数时,它确保我调用了正确的函数但是,当项目或库中某处存在同名的非静态函数时,我是否也可以确保调用本地静态函数?也就是说,静态函数是否在本地隐藏非静态函数 当然,我可以测试它(我也测试过),但我想知道这种行为在C/C++中是否有固定的定义。谢谢 编辑:对我造成意外行为的简化示例代码。问题是关于问题的修复(假设我无法更改库) 在m

我试着查找这个,但在任何地方都找不到。所以问题是:

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
+
其他文件
->
mylib.a

已编译的
myprog.c
->
myprog.o


链接的
myprog.o
+
mylib.a
->
myprog

由于函数具有默认的外部链接,因此新的
静态
函数将导致链接说明符冲突

如果非
静态
函数的声明不可见,将调用
静态
函数:

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

您将得到一个编译错误,因为函数具有默认的外部链接,因此新的
静态
函数将导致链接说明符冲突

如果非
静态
函数的声明不可见,将调用
静态
函数:

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

它不隐藏在同一作用域中声明的同名函数。但是,您可能无法将具有相同签名的函数声明为具有内部和外部链接。

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

是的,这是我的观点-我最近碰巧在一个库源文件中,有一个本地函数没有
static
关键字,我在应用程序中创建了一个具有相同签名的函数。它被编译,即使库函数没有在任何头中声明,它也被执行,而不是我的本地函数(在那个时候它不是静态的)。那么,我能依靠一个可见的
静态
函数来隐藏“不可见的”非
静态
函数吗?@yman它不可能只“编译”而不被声明。如果您的本地
static
是该范围中唯一的一个,那么应该调用它。你确定签名是一样的吗?(完全相同的参数)您确定没有声明函数吗?(声明时不必包含标题)它们最初都不是
静态的
,如果我不清楚,很抱歉。首先是演示的代码,它编译了,但执行得出人意料,然后我通过更改函数
intsend(void*data,intsize)修复了它
myprog.c
静态整数发送(void*数据,整数大小)。现在我想确定这种行为是有保证的(因此修复是正确的),或者它没有定义,我必须找到更好的解决方案。是的,这是我的观点-最近我碰巧在一个库源文件中,有一个本地函数没有
static
关键字,在应用程序中,我创建了一个具有相同签名的函数。它被编译,即使库函数没有在任何头中声明,它也被执行,而不是我的本地函数(在那个时候它不是静态的)。那么,我能依靠一个可见的
静态
函数来隐藏“不可见的”非
静态
函数吗?@yman它不可能只“编译”而不被声明。如果您的本地
static
是该范围中唯一的一个,那么应该调用它。你确定签名是一样的吗?(完全相同的参数)您确定没有声明函数吗?(声明时不必包含标题)它们最初都不是
静态的
,如果我不清楚,很抱歉。首先是演示的代码,它编译了,但执行得出人意料,然后我通过更改函数
intsend(void*data,intsize)修复了它
myprog.c
静态整数发送(void*数据,整数大小)。现在我想确定这个行为是有保证的(因此修复是正确的),或者它没有定义,我必须找到更好的解决方案。