문제

초기화할 구조체가 몇 가지 있는데 수동으로 수행하기는 지루할 것입니다.도움이 되는 매크로를 만들고 싶습니다...하지만 난 잘 모르겠어 전처리기는 이것으로 충분합니다.

메뉴를 나타내는 구조체가 있습니다.함수 포인터로만 구성됩니다.

typedef uint8_t (*button_handler) (uint8_t);
typedef void (*pedal_handler) (void);
typedef void (*display_handler) (void);
typedef void (*menu_switch_handler) (void);

#define ON_BUTTON(x) uint8_t menu_frame_##x##_button (uint8_t button)
#define ON_PEDAL(x) void menu_frame_##x##_pedal (void)
#define ON_DISPLAY(x) void menu_frame_##x##_display (void)
#define ON_SWITCH(x) void menu_frame_##x##_switch (void)

typedef struct menu_frame {
   button_handler on_button;
   pedal_handler on_pedal;
   display_handler on_display;
   menu_switch_handler on_switch;
} menu_frame;

이를 통해 함수를 작성하고 함수를 (.c 파일)로 분리할 수 있습니다.

ON_BUTTON(blah) { ... }

메뉴는 (.h 파일)로 표시됩니다.

ON_BUTTON(blah);
ON_DISPLAY(blah);
menu_frame menu_frame_blah = {
   menu_frame_blah_button,
   NULL,
   menu_frame_blah_display,
   NULL
};

메뉴 정의를 하나의 정의로 접을 수 있는 방법이 있습니까?확장할 수 있는 일을 할 수도 있겠네요 MENU(blah, menu_frame_blah_button, NULL, menu_frame_blah_display, NULL) 물론입니다. 하지만 다음과 같은 방법이 있습니까?

  • 더 짧게 만드십시오 (NULL 또는 일부 이름)
  • 필요성을 제거하다 ON_BUTTON(...); 구조체 이전부터

이상적으로는 MENU(blah, button, NULL, display, NULL) 핸들러와 메뉴 구조 자체를 정의합니다.예를 들어 마지막 용어가 다음으로 확장되는 것을 방지하는 방법을 모르겠습니다. ON_SWITCH(NULL).

아니면 다른 방식으로 접근해야 할까요?

도움이 되었습니까?

해결책

C에서는 조건부 매크로 확장을 수행할 수 없으므로 다음과 같이 인수에 따라 매크로가 다르게 확장됩니다.매크로 정의 내에서는 #if를 사용할 수 없습니다.

내 생각에 당신이 얻을 수 있는 최고는 다음과 같을 것 같아요 MENU(blah, ITEM(blah,button), NULL, ITEM(blah,display), NULL), 조건부 확장이 부족하기 때문에 프로토타입에 대한 별도의 세트가 여전히 필요합니다.

개인적으로 저는 그런 종류의 상용구 C 코드를 생성하는 간단한 스크립트를 작성하겠습니다.원하는 구문을 이해하는 것입니다.Python 또는 귀하에게 가장 적합한 다른 언어로…

다른 팁

나는 이전에 이런 종류의 코드를 생성하기 위해 Python 스크립트를 작성한 적이 있습니다.해당 경로로 이동하여 스크립트를 빌드 프로세스에 적용할 수도 있습니다.

조건부, 유한 루프, 기본 인수 및 이러한 모든 항목을 전처리기에서만 프로그래밍할 수 있습니다.Boost 라이브러리의 전처리기 섹션에는 그 중 일부가 구현되어 있습니다.Boost는 주로 C++용이지만 전처리기 관련 기능은 기본적으로 C에서도 작동합니다.

이러한 기술을 사용하면 복잡한 매크로를 작성할 수 있지만 사용하기 쉽습니다.C89 대신 C99를 사용하면 구현이 좀 더 간단해집니다(초기화 프로그램과 이름을 지정했습니다). VA_ARGS), 하지만 여전히.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top