Làm thế nào để tạo mã chung với cài đặt macro trong ngôn ngữ C?
Hỏi: Tôi có code quản lý rất nhiều sản phẩm khác nhau. Các biến và đặc điểm của chúng được đặt bởi macro X. Tôi muốn đặt các chức năng này là chung với nhau. Vậy làm thế nào để tạo mã chung với cài đặt macro trong ngôn ngữ C?
- Tất tần tật về lập trình phần mềm cho dân không chuyên
- Hướng dẫn tự học lập trình Python online đơn giản nhất
- Lập trình PHP là gì? Cơ hội nghề nghiệp ngành lập trình PHP
- Lập trình PLC đèn giao thông là gì? Đặc điểm của lập trình PLC đèn giao thông
- Lập trình PHP có khó không? Học lập trình PHP cần những điều kiện gì?
Table of Contents
Yêu cầu thông tin về tạo mã chung với cài đặt macro trong ngôn ngữ C:
Tệp product_1.c
void product_1_init (void * p_generic_ptr) { #define DATA (v1, …, v20) PROCESS_A; PRODUCT1_XMACRO_LOCAL_DATA PRODUCT1_XMACRO_UART_DATA #undef DỮ LIỆU } void product_1_format_data_uart (void * p_generic_ptr) { #define DATA (v1, …, v20) PROCESS_B; PRODUCT1_XMACRO_UART_DATA #undef DỮ LIỆU } … |
Tệp product_2.c
void product_2_init (void * p_generic_ptr) { #define DATA (v1, …, v20) PROCESS_A; PRODUCT2_XMACRO_LOCAL_DATA PRODUCT2_XMACRO_UART_DATA #undef DỮ LIỆU } void product_2_format_data_uart (void * p_generic_ptr) { #define DATA (v1, …, v20) PROCESS_B; PRODUCT2_XMACRO_UART_DATA #undef DỮ LIỆU } … |
Tôi muốn biết liệu có thể làm gì đó như thế này không:
Tệp product_generic.c
#define PRODUCT_FUNC (tên) PRODUCT_FUNC_ (PRODUCT_GEN_NAME, tên) #define PRODUCT_FUNC_ (tiền tố, tên) PRODUCT_FUNC __ (tiền tố, tên) #define PRODUCT_FUNC __ (tiền tố, tên) tiền tố ## name void PRODUCT_FUNC (_init) (void * p_generic_ptr) { #define DATA (v1, …, v20) PROCESS_A; PRODUCT_GEN_XMACRO_LOCAL_DATA PRODUCT_GEN_XMACRO_UART_DATA #undef DỮ LIỆU } void PRODUCT_FUNC (_format_data_uart) (void * p_generic_ptr) { #define DATA (v1, …, v20) PROCESS_B; PRODUCT_GEN_XMACRO_UART_DATA #undef DỮ LIỆU } … // đặt ở đây mọi hàm với process trong dấu phẩy cho mọi sản phẩm |
Tệp product_1.c
#define PRODUCT_GEN_NAME product_1 #define PRODUCT_GEN_XMACRO_LOCAL_DATA PRODUCT1_XMACRO_LOCAL_DATA #define PRODUCT_GEN_XMACRO_UART_DATA PRODUCT1_XMACRO_UART_DATA #include “product_generic.c” / * không hoạt động * / #undef PRODUCT_GEN_NAME #undef PRODUCT_GEN_XMACRO_LOCAL_DATA #undef PRODUCT_GEN_XMACRO_UART_DATA |
Tệp product_2.c
#define PRODUCT_GEN_NAME product_2 #define PRODUCT_GEN_XMACRO_LOCAL_DATA PRODUCT2_XMACRO_LOCAL_DATA # xác định PRODUCT_GEN_XMACRO_UART_DATA PRODUCT2_XMACRO_UART_DATA #include “product_generic.c” / * không hoạt động * / #undef PRODUCT_GEN_NAME #undef PRODUCT_GEN_XMACRO_LOCAL_DATA #undef PRODUCT_GEN_XMACRO_UART_DATA |
Vấn đề chính của tôi là cách “#include product_generic.c” trong tệp sản phẩm khác của tôi. Trong khi đó trình biên dịch không muốn bao gồm tệp ‘.c’ và tôi không thể đặt hàm trong tệp ‘.h’. Tôi cần phải làm thế nào?
Trả lời:
Phương pháp tạo mã chung với cài đặt macro trong ngôn ngữ C theo thông tin trên.
Chúng ta cần biết điều đó, thao tác thay thế macro trong ngôn ngữ C cho PRODUCT_GEN_XMACRO_LOCAL_DATA sẽ hoạt động, nhưng void PRODUCT_GEN_NAME ## _init (void * p_generic_ptr) thì không. Bạn chỉ có thể sử dụng ## bên trong tiền xử lý macro và ít nhất một trong các phần được kết nối phải là một macro đối số.
Thao tác cài đặt như sau:
2.1. Giải pháp tạo chung mã với cài đặt macro trong ngôn ngữ C 1
_file product_generic.c_
/ * thêm PRODUCT_GEN_NAME cố định làm tiền tố * / #define PRODUCT_FUNC (tên) PRODUCT_FUNC_ (PRODUCT_GEN_NAME, tên) / * lệnh gọi macro tiếp theo cần thiết để mở rộng PRODUCT_GEN_NAME trước ## * / #define PRODUCT_FUNC_ (tiền tố, tên) PRODUCT_FUNC __ (tiền tố, tên) / * và cuối cùng là nối các phần * / #define PRODUCT_FUNC __ (tiền tố, tên) tiền tố ## name / * bạn cũng có thể sử dụng macro thứ hai tại đây * / / * void PRODUCT_FUNC_ (PRODUCT_GEN_NAME, _init) (void * p_generic_ptr) * / void PRODUCT_FUNC (_init) (void * p_generic_ptr) { #define DATA (v1, …, v20) PROCESS_A; PRODUCT_GEN_XMACRO_LOCAL_DATA PRODUCT_GEN_XMACRO_UART_DATA #undef DỮ LIỆU } void PRODUCT_FUNC (_format_data_uart) (void * p_generic_ptr) { #define DATA (v1, …, v20) PROCESS_B; PRODUCT_GEN_XMACRO_UART_DATA #undef DỮ LIỆU } … // đặt ở đây mọi hàm với process trong dấu phẩy cho mọi sản phẩm |
2.2. Giải pháp tạo ra chung mã đề với macro cài đặt trong ngôn ngữ C với tệp product_generic.c
Nếu bạn không được phép bao gồm tệp C cũng như không xác định các chức năng trong tệp tiêu đề, bạn có thể sử dụng một tệp duy nhất product_generic.c có chứa #include “product_definitions.h” và sử dụng các tệp bao gồm sản phẩm có thể có cùng tên nhưng ở các vị trí khác nhau
product_1 / product_definitions.h product_2 / product_definitions.h … |
Khi kết hợp với sản phẩm biên dịch lệnh có thể bằng cách sử dụng các bao gồm các thư mục và các tập tin khác nhau. Chúng ta sẽ thu được như thế này:
cc -I product_1 product_generic.c -o product_1.c cc -I product_2 product_generic.c -o product_2.c … |
_file product_generic.c_
#include “product_definitions.h” / * thêm PRODUCT_GEN_NAME cố định làm tiền tố * / #define PRODUCT_FUNC (tên) PRODUCT_FUNC_ (PRODUCT_GEN_NAME, tên) / * lệnh gọi macro tiếp theo cần thiết để mở rộng PRODUCT_GEN_NAME trước ## * / #define PRODUCT_FUNC_ (tiền tố, tên) PRODUCT_FUNC __ (tiền tố, tên) / * và cuối cùng là nối các phần * / #define PRODUCT_FUNC __ (tiền tố, tên) tiền tố ## name void PRODUCT_FUNC (_init) (void * p_generic_ptr) { #define DATA (v1, …, v20) PROCESS_A; PRODUCT_GEN_XMACRO_LOCAL_DATA PRODUCT_GEN_XMACRO_UART_DATA #undef DỮ LIỆU } void PRODUCT_FUNC (_format_data_uart) (void * p_generic_ptr) { #define DATA (v1, …, v20) PROCESS_B; PRODUCT_GEN_XMACRO_UART_DATA #undef DỮ LIỆU } … // đặt ở đây mọi hàm với process trong dấu phẩy cho mọi sản phẩm |
_file product_1 / product_definitions.h_
#define PRODUCT_GEN_NAME product_1 #define PRODUCT_GEN_XMACRO_LOCAL_DATA PRODUCT1_XMACRO_LOCAL_DATA #define PRODUCT_GEN_XMACRO_UART_DATA PRODUCT1_XMACRO_UART_DATA |
Khi tạo chung mã với macro cài đặt trong ngôn ngữ, bạn cần xác định tệp các chức năng. Sao cho chúng có chung mã nhận các liên quan đến nhau. Đối với đơn chức năng khối ít dòng mã, nên sử dụng macro trong ngôn ngữ C thay vì hàm, nhưng chú thích tạo chung mã để đơn giản hóa các thao tác. Tham khảo phương pháp giải quyết trên để thao tác với máy tính của bạn nhé.
=> Khác biệt điểm giữa C ++ và Java mà bạn cần biết
Nguyễn Vân Anh (theo Stack Overflow)
Bình luận (0
)