首页 > 代码库 > 你真的了解C中的声明吗 —— 简版dcl程序

你真的了解C中的声明吗 —— 简版dcl程序

小测试看看你理解对几个:char **argv    argv: pointer to char array  int (*daytab)[13]    daytab: pointer to array[13] of intint *daytab[13]    daytab: array[13] of pointer to intvoid *comp()    comp: function returning pointer to voidvoid (*comp)()    comp: pointer to function returning voidchar (*(*x())[])()    x: function returning pointer to array[] of    pointer to function returning charchar (*(*x[3])())[5]    x: array[3] of pointer to function returning    pointer to array[5] of char-----------------------------------------------------------------------------------------------------------------------------------/* dcl: parse a declarator */void dcl(void){    int ns;    for (ns = 0; gettoken() == *; ) /* count *‘s */        ns++;    dirdcl();    while (ns-- > 0)        strcat(out, " pointer to");}/* dirdcl: parse a direct declarator */void dirdcl(void){    int type;    if (tokentype == () {    /* ( dcl ) */    dcl();    if (tokentype != ))        printf("error: missing )\n");    } else if (tokentype == NAME) /* variable name */        strcpy(name, token);    else        printf("error: expected name or (dcl)\n");    while ((type=gettoken()) == PARENS || type == BRACKETS)        if (type == PARENS)            strcat(out, " function returning");        else {            strcat(out, " array");            strcat(out, token);            strcat(out, " of");        }} #include <stdio.h>#include <string.h>#include <ctype.h>#define MAXTOKEN 100                     enum { NAME, PARENS, BRACKETS };void dcl(void);void dirdcl(void);int gettoken(void);int tokentype;/*type of last token */char token[MAXTOKEN];/*last token string */char name[MAXTOKEN];/*identifier name */char datatype[MAXTOKEN];/*data type = char, int, etc. */char out[1000];main() /* convert declaration to words */{    while (gettoken() != EOF) {        /* 1st token on line */        strcpy(datatype, token); /* is the datatype */        out[0] = \0;        dcl();        /* parse rest of line */        if (tokentype != \n)            printf("syntax error\n");        printf("%s: %s %s\n", name, out, datatype);    }    return 0;} int gettoken(void) /* return next token */{    int c, getch(void);    void ungetch(int);    char *p = token;    while ((c = getch()) ==   || c == \t)        ;    if (c == () {        if ((c = getch()) == )) {            strcpy(token, "()");            return tokentype = PARENS;        } else {            ungetch(c);            return tokentype = (;        }    } else if (c == [) {        for (*p++ = c; (*p++ = getch()) != ]; )            ;        *p = \0;        return tokentype = BRACKETS;    } else if (isalpha(c)) {        for (*p++ = c; isalnum(c = getch()); )            *p++ = c;        *p = \0;        ungetch(c);        return tokentype = NAME;    } else        return tokentype = c;}

 

你真的了解C中的声明吗 —— 简版dcl程序