제2장 지침과 성명

5629 단어
이 장에서 말한 성명은 함수 성명과 달리 모든 유형의 변수 표현식의 성명과 정의를 가리킨다.본 장의 주요 내용은 지침의 각종 성명에 대한 해독과 이해이다.
C 언어 설계 철학은 객체의 선언 형식과 사용 형식이 가능한 한 비슷하도록 요구한다.(예를 들어 intp[3];는 int형 바늘의 그룹을 나타내고 p[i]는 바늘이 가리키는 int형 데이터를 나타낸다.)이런 방식의 장점은 조작부호의 우선순위가'성명'과'사용'일 때 같다는 것이다.그러나 C 언어의 조작부호의 우선순위가 너무 복잡하기 때문에 프로그램원은 특수한 규칙을 기억해야만 성명을 이해할 수 있다.
성명을 어떻게 해석하는지 설명하기 전에 일반 성명에 포함된 각 요소를 먼저 말해라.먼저 유형 설명자 수식이다. 일반적으로 유형 설명자(void,char,short,int,long,signed,unsigned,float,double,struct,enum,union) + 저장 유형(extern,static,register) + 유형 한정자(const,volatile)로 구성된다(모든 조합이 합법적이지는 않다).그 다음에 나타난 것은 바늘 수식자(있어도 되고 없어도 되고 여러 개의 다차원 바늘을 나타낼 수도 있다)이다.뒤에 바짝 붙어 있는 것은 성명기이다.함수라면 괄호 안에 있는 함수의 인삼 형식 성명입니다.초기 값이 있으면 = 초기 값이 뒤에 옵니다.여러 변수 표현식을 동시에 선언하는 경우 쉼표(,)로 구분합니다.마지막으로 성명용 분호(;)끝.
2.1 선언된 규칙
성명은 단지 유형의 성명일 뿐, 반드시 일정한 규칙에 부합해야 한다.예를 들면 다음과 같습니다.
1.             。(          )
    :int *float*p;       
2.             。
    :int pfoo()();       
3.             。(         )
    :int pfoo()[];       
4.        。(            ,            )
    :int pfoo[]();   
5.  

2.2 선언 우선 순위
앞에서 말한 바와 같이 프로그래머는 성명을 이해하기 위해 특수한 규칙을 기억해야 한다. 이런 특수한 규칙을 C 언어 성명을 이해하는 우선순위 규칙이라고 부른다.C 언어 선언의 우선 순위 규칙은 다음과 같습니다.
A.          ,             。
B.          :
  B1             
  B2      :
       ()        
       []        
  B3      :
      *   "  ……   "
C   const、volatile             ( int,long ),           。
        ,const、volatile              。

2.3 사례 분석
  • 일반 유형
  • int f;               // int   
    (int) f;             //  f     int 
    int *f;              // int   
    int **f;             // int     
    (int*)*f;            //  f             int   
    int *f,g;            // f int   ,g int   
    int* f,g;            // f int   ,g int   
    (int*) f,g;          //     ,       。(int*)f   f     int   ,g        ,        g
    (int*)f;             //  f     int   
    
    :
    1.int* ... int *....     
    2.(int*)       
    3.(int)      
    
  • 함수
  • int f();             // f    ,    int 
    int *f();            // f    ,    int   
    (int*) f();          //  f           int   
    int (*f)();          // f    ,      ,        int ,   
    (int) (*f)();        //      f               int 
    int *(*f)();         // f    ,      ,        int   ,   
    (int *)(*f)();       //      f               int   
    
    :
    1.     ()                     
    2.         ()        
    3.         ()    ,       
    
  • 수조
  • int f[N];            // f int   
    int *f[N];           // f   ,          int   
    int f()[];           // f   ,       int   。  
    int f[N]();          // f   ,             int      。  
    int (*f[N])();       // f   ,            ,        int      。
    int *(*f[N])();      // f   ,            ,        int        。
    int *(*f[N])(),p;    // p   int   。
    int (*f)(int , float);      // f    ,      int ,       int float    
    int *(*f[N])(int , float);  // f    ,            ,        int   ,     int float    
    
    :
    1.                      。
    2.    :
           ,                。
          (*f[N]),       ,[]>*,f[N]           N   ,
          *f[N]               。
           ,       ,    ,    。
           (int, float)  () ,         ,           int float,
            int *         int   。
    3.char *const *(*nest)();   
        // nest    ,        char *const *     。
        //            ,            char   。
    

    주: 반환값 형식의 해석은 포인터와 형식 한정자 1장을 참조합니다.
    2.4 typedef 단순화 선언
    typedef는 하나의 형식에 새로운 이름을 도입하는 것입니다. 이 형식의 변수에 공간을 분배하지 않습니다. 이것은 함수의 설명과 유사합니다.일반적인 성명과 다른 점은 일반적인 성명은'이 이름은 지정된 유형의 변수'라고 하고 typedef는'이 이름은 지정된 유형의 동의어'라고 선언하는 데 있다.
    Unix 시스템 신호 메커니즘에는 다음과 같이 명시된 Signal이라는 신호 함수가 있습니다.
    void (*signal(int signo,  void (*func) (int)))(int);
    

    분석은 다음과 같습니다.
      ,          signal,       ,  signal    。
            。
     ( *signal() ) signal          ,
      void  (*signal())(int);        B     , B       void ,   int 。
    
      ,   signal     。
           int    ,      void (*func) (int)。
     (*func )       , (*func )(int)                   int    ,
     void (*func) (int)         void 。
    
      ,signal   :    ,                void 、   int         。
              int ,                  void 、   int         。
    

    앞의 성명 부분에 대한 지식을 공고히 하기 위해 지금 간단명료하게 토론하겠습니다.
    void  *signal(int signo,  void (*func) (int)) (int);
    

    분석은 다음과 같습니다.
     signal(…)  signal    ,  signal(…)(int),             。
                 ,          。
    

    현재 우리는 typedef로 성명을 간소화할 수 있다. 이 함수에 관해서는 보통 다음과 같은 두 가지 간소화 성명 형식이 있다.
    방법 1:
    typedef void(*ptr_to_func)(int);
      :  ptr_to_func     ,           void 、   int    。
    
    ptr_to_func signal(int , ptr_to_func);
      :    signal,        。
          int  ,      ptr_to_func  ,    ptr_to_func  。
      ,signal    :    ,                void 、   int         。
              int ,                  void ,   int         。
    

    방법 2:
    typedef void ptr_to_func(int);
      :ptr_to_func     ,       int ,    void 。
    
    ptr_to_func* signal(int , ptr_to_func*);
      :    signal,        。
          int  ,        ptr_to_func   ,       ptr_to_func   。
      ,signal    :    ,                void 、   int         。
              int ,                  void ,   int         。
    

    typedef와 #define은 다릅니다.typedef는 형식 성명입니다. 어떤 변수가 어떤 유형인지를 나타냅니다. 우리는 이 변수 이름으로 다른 변수 성명 규칙을 참조하여 새로운 형식 변수를 다시 성명할 수 있습니다.#define은 매크로 정의일 뿐입니다. 매크로 교체는 매크로 교체가 발생하는 모든 곳에서 이루어집니다.
      :
        typedef int* AA; AA b,c;     int *b,*c;
     ,
        #define AA int*; AA b,c;     int *b,c;
    

    좋은 웹페이지 즐겨찾기