C언어 고급문법에 대한 질문입니다.

조회수 1529회

가끔 C를 공부하다보면 자주 보지못했던 표현들을 봤었는데요

이번에 AVR 펌웨어를 만들다가 라이브러리에서 제공해주는 인터럽트 함수를 사용하는데, 갑자기 문득 어떻게 구현되어있는지 궁금해서 소스코드를 찾아보게됬어요.

공식문서에서는 인터럽트처리를위해서 ISR(...) 매크로를 사용하라고 하던데요
제가 궁금한건 아래 첨부한 C 코드에서의 문법들이에요.

이런 문법표현들에 대한 정의는 무엇인가요?
또 이와 관련된 표준문서는 어디서 확인할수있나요??

원본코드

#ifdef __cplusplus
#  define ISR(vector, ...)            \
    extern "C" void vector (void) __attribute__ ((signal,__INTR_ATTRS)) __VA_ARGS__; \
    void vector (void)
#else
#  define ISR(vector, ...)            \
    void vector (void) __attribute__ ((signal,__INTR_ATTRS)) __VA_ARGS__; \
    void vector (void)
#endif

질문

#ifdef __cplusplus
#  define ISR(vector, ...)            \    /* 매크로 정의부분에서 다중파라미터? */
    extern "C" void vector (void) __attribute__ ((signal,__INTR_ATTRS)) __VA_ARGS__; \
    /* extern "C" 의 의미 (외부변수선언에 문자열선언?) */
    /* (void) __attribute__  의 의미 (함수타입에대한 정의? 파라미터타입에대한정의?) */
    /* __VA_ARGS__  의 의미  */
    void vector (void)
    /* 위에서 세미콜론이 나왔는데 또다시 함수선언? */

#else
#  define ISR(vector, ...)            \
    void vector (void) __attribute__ ((signal,__INTR_ATTRS)) __VA_ARGS__; \
    /* 왜 cpp 컴파일에서만 extern "C" 를 선언해주는가? */
    void vector (void)
#endif

1 답변

  • 제가 avr 프로그래밍을 했던때는 인터럽트를 SIGNAL() 을 사용했었는데 근래에는 ISR 매크로를 사용하는군요.

    일단 extern "C"는 링크규칙을 정하기 위해서 사용하는데 보통 사용하는 이유는 c++ 네임 맹글링 때문에 그렇습니다. 네임 맹글링에 의해서 export되는 함수명이 변경이 되기 때문에 그것의 방지입니다. 즉 네임맹글링 방지입니다.(이 부분은 검색하면 더 자세한 내용을 학습할 수 있습니다.)

    attribute 은 gcc에만 있는 기능입니다. packed 나 section 같은 컴파일러에 추가적인 지시를 할 수 있는 기능입니다.

    VA_ARGS 는 가변매크로를 만들때 필요한 것이구요.(c99 에 추가됨)

    gcc 에 대해 학습을 진행해보시기 바랍니다.

    • 잊고있었다가 뒤늦게나마 인사드립니다. 감사했었습니다^^ 안바울 2018.9.12 10:01

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)