.c 文件中的静态 function/variable
Static function/variable in .c file
我遇到的大多数解释为什么在全局函数或变量上使用 static 关键字描述其效果如下:“全局范围内的静态标记函数或变量对文件不可见(更具体地说,编译单元)在定义它们的地方之外”。鉴于静态函数很少在 .h 文件中使用,除非与内联结合使用,我问:为什么我们需要将 .c 文件中的函数和变量标记为静态,而此类 .c 文件从未包含在任何其他编译单元中, 从而破坏了将函数标记为静态以使它们在其他编译单元中“不可见”的目的?
考虑:
// a.c
static void f(void) {...}
void DoIt(void) {...}
和
// b.c
static void f(void) {...}
void DoIt(void) {...}
现在,编译器从每个源文件生成目标文件,而根本不知道存在名称冲突。当 a
和 b
链接到程序中时,void f(void)
签名对链接器是隐藏的,因为 static 关键字将它们限制在文件范围内,但它可以看到两个 void DoIt(void)
签名,因为它们都在全球范围内。现在考虑:
// c.c
extern void DoIt(void);
static void f(void)
{
DoIt(void); // Which implementation should be called here?
}
仅仅因为您从未编写过包含函数名称的头文件,并不意味着您或某些程序员不会尝试在其他地方使用该符号名称。使用 static,限制全局范围内的名称污染,希望您不会遇到太多冲突。
我们在文件范围内隐藏符号名称的另一个原因是,让其他程序员难以使用我们不打算让他们使用的函数。您在全球范围内公开的每个符号都是潜在的支持电话。如果您有数百名 products/developers 依赖于您的内部位,那么您很难重构或以其他方式修改您的代码。通过在文件范围内对他们隐藏它,你是在说“我不会支持你依赖这些符号”,所以如果他们继续这样做,他们无权在你删除它们或修改它们时抱怨由您的代码使用。
我遇到的大多数解释为什么在全局函数或变量上使用 static 关键字描述其效果如下:“全局范围内的静态标记函数或变量对文件不可见(更具体地说,编译单元)在定义它们的地方之外”。鉴于静态函数很少在 .h 文件中使用,除非与内联结合使用,我问:为什么我们需要将 .c 文件中的函数和变量标记为静态,而此类 .c 文件从未包含在任何其他编译单元中, 从而破坏了将函数标记为静态以使它们在其他编译单元中“不可见”的目的?
考虑:
// a.c
static void f(void) {...}
void DoIt(void) {...}
和
// b.c
static void f(void) {...}
void DoIt(void) {...}
现在,编译器从每个源文件生成目标文件,而根本不知道存在名称冲突。当 a
和 b
链接到程序中时,void f(void)
签名对链接器是隐藏的,因为 static 关键字将它们限制在文件范围内,但它可以看到两个 void DoIt(void)
签名,因为它们都在全球范围内。现在考虑:
// c.c
extern void DoIt(void);
static void f(void)
{
DoIt(void); // Which implementation should be called here?
}
仅仅因为您从未编写过包含函数名称的头文件,并不意味着您或某些程序员不会尝试在其他地方使用该符号名称。使用 static,限制全局范围内的名称污染,希望您不会遇到太多冲突。
我们在文件范围内隐藏符号名称的另一个原因是,让其他程序员难以使用我们不打算让他们使用的函数。您在全球范围内公开的每个符号都是潜在的支持电话。如果您有数百名 products/developers 依赖于您的内部位,那么您很难重构或以其他方式修改您的代码。通过在文件范围内对他们隐藏它,你是在说“我不会支持你依赖这些符号”,所以如果他们继续这样做,他们无权在你删除它们或修改它们时抱怨由您的代码使用。