代码之家  ›  专栏  ›  技术社区  ›  Dietrich Epp

C中的链接:GCC是遵循C99规范,还是我不理解规范?

  •  6
  • Dietrich Epp  · 技术社区  · 16 年前

    我试图理解C99中存储类说明符的确切行为,有些GCC行为似乎不符合规范,除非我误解了6.2.2(2)中的规范:

    在一个翻译单元内,标识符的每个声明 内部连接 表示相同的对象或功能。

    但是,我使用以下程序测试了GCC(powerpc-apple-darwin9-GCC-4.2.1):

    #include <stdio.h>
    static int f() {
        static int x = 0;
        return x++;
    }
    static int g() {
        static int x = 0;
        return x++;
    }
    int main(int argc, char *argv[]) {
        printf("g() = %i\n", g());
        printf("g() = %i\n", g());
        printf("f() = %i\n", f());
        printf("f() = %i\n", f());
        return 0;
    }
    

    编撰 -std=c99 ,它将打印以下内容:

    g() = 0
    g() = 1
    f() = 0
    f() = 1
    

    如果我正确理解规范,它应该打印:

    g() = 0
    g() = 1
    f() = 2
    f() = 3
    

    我理解GCC为什么会偏离这里的规范,我只是想知道对于这种行为是否有更深层的解释。

    2 回复  |  直到 16 年前
        1
  •  9
  •   James McNellis    16 年前

    下一段6.2.2/3很重要:

    如果 对于包含存储类说明符static的对象或函数,标识符具有内部链接。

    (注意强调 ).

    您的静态变量 x 没有文件作用域,它们有块作用域。

        2
  •  10
  •   sth    16 年前

    在6.2.2(6)中,它说:

    [...] 块式示波器 未使用存储类说明符extern声明的对象的标识符。

    extern . 因此它们没有联系,特别是没有内部联系。