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

Bình luận (
0
)

Bài liên quan

Tổng quan về network scanning

Tội phạm mạng luôn tìm kiếm network (mạng) tiếp theo để tấn công. Network scanning (quét mạng) là một phương pháp rất hữu ích để bảo vệ network của bạn.

5 môn học trong chương trình Blockchain Developer tại FUNiX có gì thú vị?

Tại đây, anh Nguyễn Hải Nam – Giám đốc Trung tâm Công nghệ Chuyên sâu xSeries đã có những chia sẻ cụ thể về chương trình đào tạo Blockchain Developer của FUNiX. Theo đó, khi tham gia chương trình này, các học...

Bí kíp giúp mẹ đồng hành cùng con gái học lập trình online

Có mặt trong buổi Ngày hội phụ huynh của FUNiX, chị Vũ Thị Vân - phụ huynh nữ sinh Nguyễn Vũ Khánh Linh của FUNiX đã tiết lộ những bí kíp giúp người mẹ đồng hành cùng con gái học...

Kinh nghiệm đồng hành cùng con học trực tuyến của phụ huynh FUNiX

Trong sự kiện “Ngày phụ huynh” đầu tiên của FUNiX diễn ra tối 15/1, ba vị phụ huynh FUNiX FUNiX đã có cuộc giao lưu trực tuyến thú vị, chia sẻ những kinh nghiệm đồng hành cùng con trong việc...

Những phụ huynh có con “mê tít” chương trình công nghệ thông tin online

Con khẳng định: “Không thấy học công nghệ thông tin online ở FUNiX có bất cứ nhược điểm gì. Cháu hài lòng khi không phải hít bụi để đi học thêm, không phải tham gia các lớp học thêm, học...

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)        

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