当我创建一个静态库时,typedef结构会导致名称冲突吗?
鉴于下面的示例头文件,我了解myFun()
将是外部符号,并且可能与具有myFun()
函数的任何其他库冲突。为了避免这种情况,最好的办法是给myFun()
一个更长更具体的名称。
// myFile.h
typedef struct
{
int myVar;
} myStruct;
void myFun(myStruct * input);
myStruct
是一个外部符号,在与另一个库链接时会导致命名冲突吗?
当我查看带.a
的{{1}}静态库文件时,为什么没有列出?
答案 0 :(得分:2)
不,名称只能通过链接在库(或源文件)外部显示,而在C中,类型没有链接。 C11§6.2.2/ 2:
在构成整个程序的翻译单元和库的集合中,具有外部链接的特定标识符的每个声明表示相同的对象或功能。
不同翻译单元中的两个struct
定义(通常来自包含公共标题)必须匹配一定程度的相似性才能实现彼此的兼容性,但从概念上讲,每个翻译单元都有自己独特的一组数据类型。
在C ++中,理论上您会引起关注,因为类类型和类类型声明的typedef
名称确实存在联系。但是,实际上链接器不会看到它们。
所以,真的没什么可担心的。