如何从typename中删除顶级指针?

时间:2015-12-22 09:59:34

标签: c function pointers types

例如,如果我有:

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

我希望能够轻松地声明一种类型的功能,即' pFuncType'是指针。像这样:

(*pFuncType) funcDeclr;

这甚至可能吗?

2 个答案:

答案 0 :(得分:3)

  

这甚至可能吗?

这是不可能的。声明

typedef int * intptr;  

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

intptr p;    // Same as int * p;  

使用intptr无法声明int类型的变量。做

(*inptr) i; 

相当于

(*(int *)) i;

这是一种错误的语法 同样适用于pFuncType

另请注意,声明规则是 declation说明符必须位于声明符之前。 *来自声明符,因此它不能出现在任何声明说明符之前。查看grammar 1

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

一节中找到

答案 1 :(得分:0)

没有。但是,您可以声明非指针类型:

typedef int (funcType)(int a, char b);

funcType f;

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