外部变量重新定义为静态没有错误
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.
即不需要编译器错误。
我写了下面的代码:
//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.
即不需要编译器错误。