You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何GCC允许标签后直接声明变量,而Clang却不允许?

GCC可编译但Clang报错的C代码疑问

我碰到一段C代码,用GCC能编译通过,但Clang直接报错:

#include<stdio.h>

int main(int argc, char **argv) {
    int test = 0;

    if (test == 0) {
        goto print_five;
    } else {
        return 0;
    }

 print_five:
    int five = 6;

    printf("value of five: %d\n", five);
    return 0;
}

要是把five的声明移到函数顶部(test变量下面),两款编译器都能正常编译。

一开始我查了些资料,以为是goto跳过变量初始化的问题,就像switch的case分支里必须加作用域那样。但下面这两个变体却能在GCC和Clang下都编译通过:

第一个变体:

print_five:
    printf("value of five: ");
    int five = 6;
    printf("%d\n", five);
    
    return 0;

第二个变体:

print_five: ;
    int five = 6;     
    printf("value of five: %d\n", five);
    return 0;

看起来问题出在标签后直接跟变量声明上,但为什么GCC能过而Clang不行?这俩编译器里是不是有一个存在bug?


内容的提问来源于stack exchange,提问作者Ethan Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 04:26:27