繁体   English   中英

typedef 错误:')' 标记前的预期未限定 ID

[英]typedef error: expected unqualified-id before ')' token

typedef int (*)[4] p_array;                                                                                                                               
 
int main()
{
    int a[3][4] = {{1, 1, 1, 1}, {2, 2, 2, 2}, {3, 3, 3, 3}};
    p_array p = a;
 
    return 0;
}

typedef oldTypeName newTypeName我理解typedef语法是这样的,所以我在我的代码中为int (*)[4]类型定义了一个新名称,这意味着它是一个指针,指向的类型是一个长度为 4 的数组,元素类型为数组是整数。 我认为我的代码在逻辑上是正确的。 但它不能被编译器接受。 我应该如何理解typedef的语法。

定义 typedef 名称类似于声明变量。

例如,如果你想声明一个指向 int[4] 类型数组的指针,你可以写

int ( *p_array )[4];

或者

int ( *p_array )[4] = a;

其中a表示一个数组,类型为int[3][4]

因此,您可以为此类指针的类型声明一个别名,例如

typedef int (*p_array )[4];

或者

int typedef (*p_array )[4];

或者一开始你可以为数组类型int[4]引入一个别名,比如

typedef int Array[4];

然后使用此别名为指向此类数组的指针引入别名

typedef Array *p_array;

现在你可以写

p_array p;

或者

p_array p = a;

这是一个演示程序。

#include <stdio.h>

typedef int Array[4];
Array typedef *p_array;

int main(void) 
{
    Array a[3] = {{1, 1, 1, 1}, {2, 2, 2, 2}, {3, 3, 3, 3}};
    p_array p = a;
    
    for ( ; p != a + 3; ++p )
    {
        for ( int *q = *p; q!= *p + 4; ++q )
        {
            printf( "%d ", *q );
        }
        
        putchar( '\n' );
    }
    
    return 0;
}

它的输出是

1 1 1 1 
2 2 2 2 
3 3 3 3 

像这样

typedef int (*p_array)[4];

你对 typedef 语法的理解合乎逻辑但不正确。

正确的理解是考虑变量声明(在您的情况下为int (*p_array)[4]; )并将关键字typedef放在其前面。 Typedef 将变量声明转换为类型声明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM