📜 三大核心硬规则(必须遵守)

规则具体规定违规示例(绝对禁止)违背后果
规则一:双下划线与下划线+大写所有以 __(双下划线)开头,或 _ + 大写字母(如 _A)开头的标识符,无论在哪个作用域,都被保留。__init()、_BOOT_FLAG、_Var编译器或库内部使用,重定义会导致未定义行为,极难排查。
规则二:文件作用域的单下划线在文件作用域(全局)中,所有以 _(单下划线)+ 小写字母开头的标识符,被保留用作文件作用域标识符。全局变量 int _my_count;、全局函数 void _task(void)可能与编译器的内部全局符号冲突,导致链接错误。
规则三:标准库原住民不可定义任何与标准库函数、宏、类型同名的外部标识符。int printf;、typedef int FILE;、#define malloc即使没包含头文件,这些名字也可能被编译器保留,链接时报错或行为异常。

🧐 次一级的“未来保留”陷阱(记住前缀)

标准还为未来的库扩展保留了一系列前缀命名空间,虽然日常没那么敏感,但在正式项目中用它们作为自定义名字是不太合适的:

  • E + 数字/大写:如 E10、EAGAIN(保留给错误码)。

  • SIG + 大写:如 SIGINT、SIGALRM(保留给信号名)。

  • is / to + 小写:如 isalpha、toupper(保留给字符处理函数)。

  • str / mem / wcs + 小写:保留给字符串和内存操作库的扩展。


🛡️ 给嵌入式开发者的“免死金牌”级建议

既然规则这么严格,平时写代码怎么确保绝对安全?遵循下面这两条就够用了:

  1. 永远不要自己定义以下划线开头的名字。不管是 _ 还是 __,统统避开。变量名直接用 counter、status_flag,函数用 uart_send,不加前缀下划线,完美规避掉规则一和规则二。

  2. 变量/函数命名加上“模块前缀”。为了避免与标准库冲突(规则三),建议给所有全局标识符加上项目缩写或模块缩写,例如 mcu_、os_、app_。比如 mcu_set_clock(),这个前缀在标准库里不存在,绝对安全。

更多推荐