C 언어에서 매크로를 사용하여 여러 문자열을 연결하는 방법(# 및 ## 사용법)

4338 단어 other
최근에 프로젝트의 코드를 작성할 때 매크로 정의에 여러 문자열을 연결해야 한다. 구체적으로 말하면 소프트웨어 버전 번호를 정의한 다음에 하드웨어 버전 번호를 정의한 다음에 그들을 합쳐서 종합 버전 번호를 만들어야 한다.이 동작들은 내가 매크로 정의에서 직접 완성하여 코드의 가독성과 이식성을 제공하기를 바란다.
다음과 같습니다.
#define SOFTWARE_VERSION     "Software:V1.00"
#define HARDWARE_VERSION     "Hardware:V1.00"
#define SYSTEM_VERSION       ????

위와 같이 SOFTWAREVERSION 및 HARDWAREVERSION이 연결되면 일반적인 프로그램 원숭이들은 모두 알고 있을 것이다. 사실 방법은 매우 간단하다. 바로'#'과'##'이라는 특수한 매크로 전의 문자를 사용하는 것이다.간단히 살펴보겠습니다.
1. #: 문자열
"#"의 기능은 뒤에 있는 매크로 매개 변수를 문자열화(Stringfication)하는 것입니다. 쉽게 말하면 매크로 변수를 참조한 다음 대체를 통해 좌우에 더블 따옴표를 붙입니다.예를 들어 다음 코드의 매크로:
#define WARN_IF(EXP)                                  \
do {                                                  \
    if (EXP) {                                        \
        fprintf(stderr, "Warning: " #EXP "/n");       \
    }                                                 \
} while(0);

그러면 실제 사용에서 다음과 같은 교체 과정이 나타납니다.
WARN_IF (divider == 0);

다음으로 대체
do {

    if (divider == 0) {
        fprintf(stderr, "Warning" "divider == 0" "/n");
    }

} while(0);

2, ##: 두 매개변수 연결
'##'은 두 개의 Token을 하나의 Token으로 연결하는 데 사용되는 연결부호(concatenator)라고 불린다.여기에 연결된 대상이 Token이면 되고 반드시 거대한 변수가 아니다.예를 들어 메뉴 항목의 명령 이름과 함수 바늘로 구성된 구조체의 그룹을 만들고 함수 이름과 메뉴 항목의 명령 이름 사이에 직관적이고 이름상의 관계가 있기를 바란다.그러면 다음 코드는 매우 실용적이다.
struct command
{
    char * name;
    void (*function) (void);
};

#define COMMAND(NAME) {NAME, NAME##_command}

//                         command      :

struct command commands[] = {
    COMMAND(quit),
    COMMAND(help),
    ...
}

COMMAND 매크로는 여기서 코드 생성기의 역할을 충당한다. 이렇게 하면 어느 정도에 코드 밀도를 줄일 수 있고 간접적으로 부주의로 인한 오류를 줄일 수 있다.우리는 n개의 ##기호로 n+1개의 Token을 연결할 수 있는데 이 특성도 #기호가 가지지 못한 것이다.예를 들면 다음과 같습니다.
#define LINK_MULTIPLE(a,b,c,d) a##_##b##_##c##_##d

typedef struct _record_type LINK_MULTIPLE(name,company,position,salary);

//           :

//  typedef struct _record_type name_company_position_salary;

그래서 위에서 제기한 문제는 자연히 해결할 수 있다.다음과 같습니다.
#define SOFTWARE_VERSION     "Software:V1.00"
#define HARDWARE_VERSION     "Hardware:V1.00"
#define SYSTEM_VERSION       SOFTWARE_VERSION##" "##HARDWARE_VERSION

그러나 실제 테스트를 통해 이상의 코드는 KEIL/ADS/IAR 등 통합 컴파일 환경에서만 사용할 수 있습니다.만약 linux에서 gcc 컴파일러를 사용한다면 상술한 코드는 오류가 발생할 것이며 아직 구체적인 원인을 찾지 못했다.한바탕 고생한 후에 gcc 환경에서 여러 문자열을 연결하려면 빈칸으로 연결하면 된다는 것을 발견하였다.따라서 다음과 같은 문구로 변경하면 됩니다.
#define SOFTWARE_VERSION     "Software:V1.00"
#define HARDWARE_VERSION     "Hardware:V1.00"
#define SYSTEM_VERSION       SOFTWARE_VERSION HARDWARE_VERSION

계속해서......

좋은 웹페이지 즐겨찾기