外部变量重新定义为静态没有错误

No error for extern variable redefined as static

我写了下面的代码:

//f1.h
extern uint8 yyy;

//f1.c
#include "f1.h"
uint8 yyy;
...
//many more variables created by previous developers
static uint8 yyy; //created by previous developers
...

我假设以前的开发人员没有命名这样的变量并创建了 yyy。 经过一些代码审查更改后,我决定将 yyy 重命名为其他名称,并且在 f1.c 中搜索 yyy 时,我在 f1.c 中发现了另一个静态变量

static uint8 yyy;

为什么编译器最初没有警告我有关另一个变量 yyy 的信息?

在执行文件的 Lint 时,Lint 只是给出警告:

Warning 401: symbol 'yyy' not previously declared static at line.

假设我没有 Lint,是否可以声明同名的静态变量和外部变量? 我可以做什么检查来确保在创建新变量时变量名不存在?

我认为您描述的代码 (uint8 yyy; static uint8 yyy;) 具有未定义的行为。 C99,6.2.2 标识符的链接

3. If the declaration of a file scope identifier for an object or a function contains the storage-class specifier static, the identifier has internal linkage.

5. [...] If the declaration of an identifier for an object has file scope and no storage-class specifier, its linkage is external.

7. If, within a translation unit, the same identifier appears with both internal and external linkage, the behavior is undefined.

即不需要编译器错误。