当前位置:  开发笔记 > 程序员 > 正文

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

如何解决《C中的链接:GCC是否遵循C99规范,或者我不理解规范?》经验,为你挑选了2个好方法。

我试图理解C99中存储类说明符的确切行为,并且一些GCC行为似乎不遵循规范,除非我误解了规范.从6.2.2(2):

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

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

#include 
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会偏离这里的规范,我只是想知道这种行为是否有更深层次的解释.



1> sth..:

在6.2.2(6)中它说:

以下标识符没有链接:[...]没有存储类说明符extern声明的对象的块作用域标识符.

静态变量是对象的块作用域标识符,并且不会声明它们extern.因此它们没有联系,特别是没有内部联系.


+1; 这比我引用的段落更有意义.

2> James McNell..:

下一段6.2.2/3很重要:

如果对象或函数的文件范围标识符的声明包含静态的存储类说明符,则标识符具有内部链接.

(注意强调的文件范围标识符).

您的静态变量x没有文件范围,它们具有块范围.


@Dietrich:是的.事实上,它很容易,我错过了更相关和更重要的部分,作为答案发布了.
推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有