【问题标题】:Idiomatic way to declare local functions in C [closed]在 C 中声明局部函数的惯用方法 [关闭]
【发布时间】:2013-12-14 14:56:35
【问题描述】:

我的小程序由几个“模块”——翻译单元组成。一些实体是extern,但其他实体是static

对于外部实体,我总是放一个前缀。您可以通过前面的static 告诉您内部的。不过,我正在寻找一种命名约定,清楚地表明该实体是

  • 文件特定,从外部看不到
  • 可以安全地更改而不会有更改 api-s 的风险
  • 如果前面没有静态,这是一个错误。

Python 程序员使用前导下划线。 C 程序员是做什么的?

【问题讨论】:

  • 一个有争议的声明,@P0W。在任何情况下,都不要使用前导下划线:它们是保留的(用于编译器等)。
  • Python 方式是约定使用前导下划线,在c 中,如果你使用static,编译器将对符号的访问限制为当前翻译单元。你可以使用任何你喜欢的约定,事实上,前导下划线对我来说非常直观。
  • @Kninung double 保留前导下划线
  • 为导出的函数名加上前缀,内部函数名不加前缀。然后只需使用static。这表明 1. 符号是文件本地的; 2. 因此,可以在不破坏 API 的情况下进行更改; 3. 如果有static但是 然后突然有没有 static,这是一个可怕的错误,因为你要么发疯了,要么违背自己的意愿回到过去。
  • @H2CO3, C11, 7.1.3 说:以下划线开头的所有标识符始终保留用作普通和标记名称空间中具有文件范围的标识符。 这意味着像_name 这样的名称将(不应该)通过任何标题(或在链接期间)暴露给您的文件,我相信这也意味着如果您在文件中使用它是可以的,如果您确保它仅包含在该文件中。

标签: c naming


【解决方案1】:

很多东西,但要避免前导下划线,因为这在多种环境中很神奇。

【讨论】:

  • 我觉得一个下划线可以,两个有问题?
  • 在使用了尽可能多的操作系统和编译器之后,我只是避免使用前导和尾随下划线。无论我正在研究的任何本地“最佳实践”如何,我都会努力避免在任何变量或函数名称中使用简单的单词,因为如果你在不同的环境中移动相同的代码,你永远不知道#define 会咬你什么。某些类型的前缀在这里有所帮助。
【解决方案2】:

static 声明传达了您的问题。自然,它没有满足这个要求:

如果前面没有静态,这是一个错误。

但我认为这是一个愚蠢的要求。你说你在 Python 中使用_,从构建一个文件的安全性的角度来看(在 C 中,“编译一个翻译单元”),它是严格劣等的。如果省略它,Python 直到运行时才会注意到,并且行为不会改变。也许您需要 Python 中的另一个要求来提醒读者_ 可能丢失。 __ 怎么样?但是如果 that 不见了怎么办?等等。如果您的程序没有终止并且应该终止怎么办?你不能写"does it stop" 支票。

无论如何,根据我的经验,C 开发人员实际上并不担心这一点。如果它可以帮助您阅读,那么在明智的情况下自己编造并坚持下去并不是不合理的。也许s_ 用于静态,m_ 用于模块,t_ 用于翻译单元等。我认为这些前缀在 C 和 C++ 中对于特殊类变量来说是一个弱“元约定”,例如班级成员。

【讨论】:

    【解决方案3】:

    我建议不要将static 编码为函数名称。为什么?因为名称应该以清晰简洁的方式传达功能的用途。它存储在哪里以及在哪里可以访问通常并不重要。

    请注意,此参数特定于函数上的static。它不适用于变量名称上的const(我个人使用k-前缀)或全局变量(首先应避免使用) )。

    【讨论】:

    • 我同意。 “在 C 中声明局部函数的惯用方式”是使用 static,而不是在函数和变量名称上创建并行命名约定来做同样的事情。
    猜你喜欢
    • 1970-01-01
    • 2021-07-08
    • 2023-03-21
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 2018-06-05
    • 2011-10-22
    相关资源
    最近更新 更多