1

这是文件“1.c”

    #include <stdio.h>
    char foo;
    int bar(){
    }
    int main(){
        printf("%d",foo);
        return 0;
    }
    //--------------------------

这是文件'2.c'

    void foo(){
    }

编译器调用为gcc 1.c 2.c

以上是否给出了未定义的行为?我的猜测是,的。否则几乎不可能进行优化。

同一实体的多个不同定义(类、模板、枚举、内联函数、静态成员函数等) [C++ 程序员应该了解哪些常见的未定义行为?

但据我所知,char foo只产生一个弱符号,可以在链接时被void foo(){}覆盖。此外,如果我char foo变成extern char foo,那仍然是一个定义吗?

4

1 回答 1

2

它会导致未定义的行为,是的。标准中可能有很多明确引用各种类型的声明等等,但总结一下:

在构成整个程序的一组翻译单元和库中,具有外部链接的特定标识符的每个声明都表示相同的对象或函数。(6.2.2)

所有引用相同对象或函数的声明都应具有兼容的类型;否则,行为是未定义的。(6.2.7)

char foo;在您的示例中是一个暂定定义。如果你使用extern,它不会是一个定义,但它仍然是一个声明,上面仍然适用。

于 2013-04-09T00:10:53.787 回答