typedef 结构在链接静态库时会导致名称冲突吗?
Posted
技术标签:
【中文标题】typedef 结构在链接静态库时会导致名称冲突吗?【英文标题】:Can typedef structures cause name ***es when linking a static library? 【发布时间】:2014-02-18 03:01:32 【问题描述】:当我创建静态库时,typedef 结构会导致名称冲突吗?
鉴于下面的示例头文件,我知道myFun()
将是一个外部符号,并且可能与具有myFun()
函数的任何其他库发生冲突。为避免这种情况,最好的办法是给 myFun()
一个更长、更具体的名称。
// myFile.h
typedef struct
int myVar;
myStruct;
void myFun(myStruct * input);
myStruct
是一个外部符号,在与另一个库链接时可能会导致命名冲突?
当我使用nm myLib.a
查看.a
静态库文件时,为什么它没有被列出?
【问题讨论】:
【参考方案1】:不,名称只能通过链接在库(或源文件)外部可见,而在 C 中,类型没有链接。 C11 §6.2.2/2:
在构成整个程序的翻译单元和库集合中,具有外部链接的特定标识符的每个声明都表示相同的对象或函数。
不同翻译单元中的两个struct
定义(通常来自包含一个公共标题)必须匹配到一定程度的相似性才能实现相互兼容,但从概念上讲,每个翻译单元都有自己独特的数据集-类型。
在 C++ 中,理论上您会担心,因为类类型以及与类类型一起声明的 typedef
名称确实具有链接。但是,实际上链接器不会看到它们。
所以,真的没什么好担心的。
【讨论】:
因此,如果我有两个不同版本的库链接并且 myStruct 在每个版本中都不同,那么就会出现问题。通过“具有外部链接的特定标识符的每个声明都表示相同的对象或函数”,我认为它们应该是相同的? @Markus 如果将同一个库的两个副本链接在一起,无论它们是否相同,都会出现重复的定义错误。 “表示相同的对象或函数”意味着它们中只有一个,并且它在库中。没有两件事是相同的。这不适用于struct
s 等类型。 (基本上)相同定义的要求确实适用于struct
s,但这不是链接。您使用的头文件中的定义需要与用于编译库的头文件中的定义兼容(基本上相同)。以上是关于typedef 结构在链接静态库时会导致名称冲突吗?的主要内容,如果未能解决你的问题,请参考以下文章
VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结
VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结