为何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
相关产品推荐
相关产品推荐

