貌似发现一个编译器bug?



  • 我用sw5cc编译两个包含【相同名字而且已经被初始化的全局变量】的文件来生成目标文件,然后如果用sw5cc链接,他会说我冲突,但是用mpicc链接就没有问题...
    代码:
    f1.c:
    int var = 2;

    void func1() {
    var = 1;
    }

    f2.c:
    int var = 2;

    void func2() {
    var = 2;
    }

    main.c
    # include <stdio.h>

    void func1();
    void func2();

    extern int var;

    int main() {
    func1();
    func2();
    printf("%d\n", var);
    return 0;
    }

    编译:
    sw5cc -host main.c f1.c f2.c
    然后会出现链接失败
    但是
    sw5cc -host -c f1.c
    sw5cc -host -c f2.c
    mpicc f1.o f2.o main.o
    可以链接成功....

    我发现这个的原因是因为提供代码里Argument.h里面有强符号定义....



  • @LyricZ 撇开这个是不是编译器bug的问题(PS:这个我们会查),但是这个问题会影响您做优化吗?



  • @popo
    我想知道的是这种情况话,mpicc是不是会把所有同名的视为一个?
    如果是的话,对我做优化没有影响
    如果不是的话,其实提供的代码本身就有问题...



  • @LyricZ 不明白为什么你要取和Argument.h里的变量名一样的变量?



  • @popo
    是Argument.h里面的变量被重复定义了呀...
    然后几乎每个文件都要包含这个头文件呀
    如果链接的时候这些重复定义的变量都是独立的
    那就不一定能保证程序的正确性?

    我比较关心的是既然没有报错 那么编译器的链接的行为是什么?

    谢谢!

    (我没有必要取一样的)



  • @LyricZ
    0_1534587037937_b9d2d3c3-fc12-4e9f-b827-7edd7c8b519a-image.png

    如果你对条件指示符#ifndef这个不了解,麻烦您百度一下,谢谢!



  • @LyricZ 如果你优化过的程序有问题,请勿怀疑我们的程序有问题。这个比赛都到尾声了,不可能还出现这么低级的错误。



  • @lyricz貌似发现一个编译器bug? 中说:

    sw5cc -host -c f1.c
    sw5cc -host -c f2.c
    mpicc f1.o f2.o main.o

    上面等同:

    sw5cc -host -c main.c
    sw5cc -host -c f1.c
    sw5cc -host -c f2.c
    sw5cc -hybrid f1.o f2.o main.o


登录后回复