C:编译器可以识别哪些变量?

标签 c compilation

假设我有以下 C 代码:

union foo {
    int x;
    double y;
} k;
char word[] = "Stack Overflow";
int number = 1;

void doStuff(int n) {
    static char c = 'C';
    char *ptr = malloc(n);
}

int main(int argc, char *argv[]) {
    int r = 120;
    k.x = 10;
    doStuff(r);
    return 0;
}

编译器可以识别哪些变量?我知道全局变量 kwordnumber 以及 c 因为它是静态的,但是函数内的变量(例如 r*ptr)又如何呢?

最佳答案

对象的存储是在运行时根据以下(不完整的)规则分配的:

  • 如果该对象是在文件范围(任何函数体之外)或使用关键字static声明的,则保证在该对象的存储空间被预留并初始化时程序启动并在程序退出时释放。

  • 如果在 block 中声明对象时没有使用static关键字,那么当程序进入该对象的内存时,保证会预留该对象的存储空间。封闭范围并在程序退出该范围时释放。 实际上,据我所知,大多数编译器都会生成代码以在函数入口处分配所有此类 block 作用域变量。

请参阅 online draft 的第 6.2.4 节C 2011 标准的更完整列表。

关于C:编译器可以识别哪些变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43008686/

相关文章:

c++ - 'using' 语句用 g++ 编译,用 clang 编译失败

php 模块不编译。不识别 "static function_entry"

c - Bash中的增减运算符是Undefined Behavior吗?

c - 在C中使用深度优先搜索找到最小生成树

c++ - 使用 restrict 关键字时出错

compilation - 如何用 Marmalade 编译 Cocos2d-X?

c - 对 'function' 的 undefined reference

c - 如何在 IRIX 上以编程方式查找 MAC 地址?

c - 我的 C 程序如何检查它是否对给定文件具有执行权限?

c++ - 在 C++ 编译器上安装 OpenCV