c - 为什么我不能将 "private"函数声明为静态的,而我根本不能将它放在头文件中?

标签 c header-files private

我理解 static 关键字用于创建对翻译单元(源文件)“私有(private)”的函数或变量。

但是,据我所知,为了确保无法从声明它的 .c 文件外部访问特定函数或变量,我可以简单地在对应的.h文件中声明。

例如:

f.c

void public_func() {
    // ...
}

void private_func() {
    // ...
}

f.h

void public_func();

// no declaration of private_func

那么为什么我还要将 private_func 声明为 static?这仅仅是一个约定,还是比不在 .h 文件中声明它具有技术优势?

最佳答案

问题是编译器在“翻译单元”的基础上工作,这意味着一个 .c 文件及其包含的所有 .h 文件。因此,传统上它无法检测整个项目中的命名冲突。

因此,如果您不将其设为static,则该函数默认具有“外部链接”。这意味着如果有一个函数 private_func 并且同一项目中的另一个翻译单元使用相同的名称,那么您在链接和链接器错误期间会发生命名空间冲突。

这也是一个正确性问题——无论是有意还是无意,私有(private)函数/变量都不应从外部访问。

关于c - 为什么我不能将 "private"函数声明为静态的,而我根本不能将它放在头文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55537604/

相关文章:

c++ - 我应该使用哪个头文件而不是#include <bits/stdc++.h>

为多个体系结构编译时的 C++ 多个函数定义

c++ - 如何在 Visual Studio 2008 中包含头文件?

node.js - 测试模块中的 node.js 类

java - 通过串行连接将minecraft插件连接到arduino

c - Microchip C18 - 奇怪的代码行为(可能与扩展模式/非扩展模式相关)

c - 如何用未知数量的对象填充 C 数组

javascript - 类中的私有(private)原型(prototype)

java - 私有(private)实例变量可在 compareTo 内使用 "public"范围访问

c - 如何使用 fgets() 来避免转换它的第二个 int 类型的参数?