Làm thế nào để tạo mã chung với cài đặt macro trong ngôn ngữ C?

Làm thế nào để tạo mã chung với cài đặt macro trong ngôn ngữ C?

Chia sẻ kiến thức 30/11/2021

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?

Yêu cầu thông tin về tạo mã chung với cài đặt macro trong ngôn ngữ C:

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

Cài đặt Macro trong ngôn ngữ C

 _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

ĐĂNG KÝ TƯ VẤN HỌC LẬP TRÌNH TẠI FUNiX

Bình luận (
0
)

Bài liên quan

  • Tầng 0, tòa nhà FPT, 17 Duy Tân, Q. Cầu Giấy, Hà Nội
  • info@funix.edu.vn
  • 0782313602 (Zalo, Viber)        
Chat Button
Chat với FUNiX GPT ×

yêu cầu gọi lại

error: Content is protected !!