代码之家  ›  专栏  ›  技术社区  ›  Jean-Francois T.

在C中使用匿名数组,但在“}”标记之前没有“expected”;“expected”

  •  0
  • Jean-Francois T.  · 技术社区  · 7 年前

    我尝试在条件块中使用一些“匿名数组”(不确定名称)。我有以下代码

    if (({10, 20, 30})[0] == 10) {
    

    -Wall -I/usr/include -Wextra -std=c99 -pedantic -Wno-unused-parameter . 它引发了以下警告和错误

    my_code.c:1:9: warning: left-hand operand of comma expression has no effect [-Wunused-value]
    my_code.c:1:13: warning: left-hand operand of comma expression has no effect [-Wunused-value]
    my_code.c:1:17: error: expected ';' before '}' token
    

    如果我在外部定义数组,它工作得很好:

    int anonymous_array_01[3] = {10, 20, 30};
    if (anonymous_array_01[0] == 10) {
    

    出了什么问题(可能是与GCC版本或编译选项相关的错误)?

    谢谢

    3 回复  |  直到 7 年前
        1
  •  3
  •   Vlad from Moscow    7 年前

    此构造

    {10, 20, 30}[0]
    

    if ( ( int [] ){10, 20, 30}[0] == 10) 
    
        2
  •  1
  •   user539810 user539810    7 年前

    文字的类型是什么 { 10, 20, 30 } ? 它是类型为的数组文字吗 int[3] , double[3] , long[3] , char[3] 甚至是结构文字(如果是,是哪种结构类型?)编译器需要您尚未提供的类型信息,因此出现编译错误。

    修复方法是包括类型信息,创建格式良好的复合文字,这是您拥有的一组值,再加上一个转换表达式:

    (int[]){10, 20, 30}
    

    可以对结构执行相同的操作:

    (struct{int x,y,z;}){10, 20, 30}
    
        3
  •  -1
  •   aditya rawat    7 年前

    if (({10, 20, 30})[0] == 10) {
    

    毫无意义。

    这只是一种错误的数组声明方式。

    可能是因为

    {10,20,30,}
    

    不调用数组。如果要进行比较,必须使用传统数组。