我试着查看,但没有找到它。所以这就是问题:
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
答案 0 :(得分:4)
您将收到编译错误,因为函数具有默认外部链接,因此新的static
函数将导致链接说明符冲突。
如果看不到非static
函数的声明,则会调用static
函数:
void foo(); //external linkage
static void foo() {}; //internal linkage and error
答案 1 :(得分:1)
它不会隐藏在同一范围内声明的具有相同名称的函数。但是,您可能没有声明具有内部和外部链接的相同签名的函数。