C 链接静态库时,typedef结构是否会导致名称冲突?

C 链接静态库时,typedef结构是否会导致名称冲突?,c,typedef,static-linking,nm,C,Typedef,Static Linking,Nm,创建静态库时,typedef结构是否会导致名称冲突 给定下面的示例头文件,我知道myFun()将是一个外部符号,并且可能与任何具有myFun()函数的其他库发生冲突。为了避免这种情况,最好给myFun()起一个更长更具体的名字 // myFile.h typedef struct { int myVar; } myStruct; void myFun(myStruct * input); myStruct是否是一个外部符号,在与另一个库链接时可能会导致命名冲突 为什么当我看到.a静

创建静态库时,typedef结构是否会导致名称冲突

给定下面的示例头文件,我知道
myFun()
将是一个外部符号,并且可能与任何具有
myFun()
函数的其他库发生冲突。为了避免这种情况,最好给
myFun()
起一个更长更具体的名字

// myFile.h

typedef struct
{
    int myVar;
} myStruct;

void myFun(myStruct * input);
myStruct
是否是一个外部符号,在与另一个库链接时可能会导致命名冲突


为什么当我看到
.a
静态库文件和
nm myLib.a

不,名称只能通过链接在库(或源文件)外部可见,而在C中,类型没有链接。C11§6.2.2/2:

在构成整个程序的一组翻译单元和库中,具有外部链接的特定标识符的每个声明表示相同的对象或函数

不同翻译单元中的两个
struct
定义(通常包括公共标题)必须匹配到一定程度的相似性,以实现彼此的兼容性,但从概念上讲,每个翻译单元都有自己独特的数据类型集

<>在C++中,理论上你有理由担心,因为类类型和类声明的名称,确实有链接。然而,实际上链接器不会看到它们


所以,真的没什么好担心的。

所以,如果我有两个不同版本的库链接,而myStruct在每个版本中都不同,那么就会有问题。通过“具有外部链接的特定标识符的每个声明表示相同的对象或函数”,我假设它们应该是相同的?@Markus如果将同一库的两个副本链接在一起,则无论它们是否是相同的版本,都会出现重复的定义错误。“表示相同的对象或函数”表示它们中只有一个,并且它在库中。没有两件事是相同的。这不适用于
struct
s等类型。(本质上)相同定义的要求确实适用于
struct
s,但这不是链接。您使用的头中的定义需要与用于编译库的头中的定义兼容(基本相同)。