【问题标题】:How to remove top-level pointer from typename?如何从类型名中删除顶级指针?
【发布时间】:2016-03-28 13:16:18
【问题描述】:

例如,如果我有:

typedef int (*pFuncType)(int a, char b);

为了方便起见,我想声明一个“pFuncType”指向的类型的函数。像这样的:

(*pFuncType) funcDeclr;

这可能吗?

【问题讨论】:

    标签: c function pointers types


    【解决方案1】:

    这甚至可能吗?

    这是不可能的。声明

    typedef int * intptr;  
    

    表示intptr 是新类型。 intptr 类型的新变量可以定义为

    intptr p;    // Same as int * p;  
    

    使用intptr 不能声明int 类型的变量。在做

    (*inptr) i; 
    

    等价于

    (*(int *)) i;
    

    这是一个错误的语法。
    pFuncType 也是如此。

    还要注意声明的规则是声明说明符必须在声明符之前。 * 出现在声明符中,因此它不能出现在任何声明说明符之前。看grammar1

    declaration
        declaration-specifiers ;
        declaration-specifiers init-declarator-list ;   
    
    declaration-specifiers
        storage-class-specifier
        type-specifier
        type-qualifier
        storage-class-specifier declaration-specifiers
        type-specifier          declaration-specifiers
        type-qualifier          declaration-specifiers
    
    init-declarator-list
        init-declarator
        init-declarator-list , init-declarator
    
    init-declarator
        declarator
        declarator = initializer   
    
    ......
    ......
    
    declarator
        direct-declarator
        pointer direct-declarator
    
    direct-declarator
        identifier
        ( declarator )
        direct-declarator [ ]
        direct-declarator [ constant-expression ]
        direct-declarator ( )
        direct-declarator ( parameter-type-list )
        direct-declarator ( identifier-list )
    
    pointer
         *
         * pointer
         * type-qualifier-list
         * type-qualifier-list pointer  
    

    1 语法可以在 C11 标准的 §6.7 和 §6.7.6 部分下找到

    【讨论】:

      【解决方案2】:

      没有。不过,您可以声明非指针类型:

      typedef int (funcType)(int a, char b);
      
      funcType f;
      
      int f(int a, char b) {
          return a;
      }
      

      【讨论】:

        猜你喜欢
        • 2011-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-20
        相关资源
        最近更新 更多