Các hàm macro so với tĩnh trong Tiêu đề


9

đối với nhiều tác vụ nhanh, trong đó người ta có thể sử dụng một hàm f(x,y), trong C đơn giản, các macro được sử dụng. Tôi muốn hỏi cụ thể về các trường hợp này, có thể giải quyết được bằng một lệnh gọi hàm (tức là các macro được sử dụng cho các hàm nội tuyến, không phải để mở rộng mã của mã tùy ý).

Thông thường các hàm C không được nội tuyến vì chúng có thể được liên kết đến từ các tệp C khác. Tuy nhiên, các hàm C tĩnh chỉ hiển thị từ trong tệp C mà chúng được xác định. Do đó, chúng có thể được nội tuyến hóa bởi trình biên dịch. Tôi đã nghe nói rằng rất nhiều macro nên được thay thế bằng cách biến chúng thành các hàm tĩnh, bởi vì điều này tạo ra mã an toàn hơn.

Có những trường hợp đây là một ý tưởng không tốt?

Xin nhắc lại: Không hỏi về các macro Sản xuất mã với các cấu trúc ## giống nhau mà hoàn toàn không thể biểu thị dưới dạng hàm.


4
Tôi nghĩ rằng câu hỏi của bạn có thể đã được trả lời ở đây stackoverflow.com/questions/9104568/macro-vs-f ghép-in-c và ở đây stackoverflow.com/questions/1358232/why-use-macros-in-c
Maru

viết một macro phù hợp là một điều khó khăn và các inlinehàm ing chỉ đảm bảo nó có thể được xác định nhiều lần trong nhị phân, trình biên dịch có thể quyết định liệu nó có thực sự nội tuyến để có thể tiết kiệm không gian hay không
ratchet freak

2
Tôi thực sự sẽ nghi ngờ hầu hết đây là những lý do lịch sử. Trước đây, trình biên dịch C hoàn toàn không có chức năng nội tuyến. Vì vậy, mọi người đã sử dụng macro cho những thứ họ muốn nội tuyến. Mã C thường tồn tại lâu bất thường.
Jan Hudec

@ratchetfreak: C không có inline, đây không phải là về C ++.
wirrbel

2
@wirrbel Tất nhiên là có inlineC, ít nhất là từ C99. Để biết tổng quan nhanh, xem Wikipedia về các chức năng nội tuyến .
amon

Câu trả lời:


6

Các macro có thể giải quyết được bằng một lệnh gọi hàm có rất nhiều cạm bẫy:

  • Chúng khó viết, vì bạn có thể phải xử lý các đối số đúng như thế nào ++i.
  • Chúng khó gỡ lỗi với trình gỡ lỗi trực quan vì bạn không thể bước qua macro hoặc đặt điểm dừng ở đó.
  • Họ khó xử lý chính xác khi phân tích các phụ thuộc biên dịch.

Các macro có thể giải quyết được bằng cách gọi hàm có thể hữu ích để cung cấp nội tuyến trong trình biên dịch nguyên thủy. Tôi không biết bất kỳ trình biên dịch nào không xử lý các hàm nội tuyến và một số thậm chí có thể nội tuyến trên các đơn vị biên dịch.

Thông thường các hàm C không được nội tuyến vì chúng có thể được liên kết đến từ các tệp C khác.

Không có lý do tại sao một trình biên dịch sẽ không thể cung cấp hai phiên bản của hàm, một phiên bản truyền thống callvà một phiên bản inlined. Bạn nên xem tài liệu của trình biên dịch mà bạn đang nhắm mục tiêu. Ngoài ra, bạn có thể muốn xem xét lắp ráp được tạo: ngay cả khi bạn không biết lắp ráp, bạn có thể nhanh chóng tìm hiểu để biết liệu một số chức năng đã được nội tuyến hay chưa. (Bắt đầu với các ví dụ bé để nhanh chóng học điều này.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.