2012-11-26 53 views
6

Tôi đang gặp phải vấn đề với việc hiểu cách sử dụng các cuộc gọi hàm macro từ bên trong một câu lệnh printf().Gọi hàm macro từ bên trong lệnh printf trong C

Tôi có đoạn code dưới đây:

#include<stdio.h> 
#define f(g,h) g##h 
main() 
{ 
    printf("%d",f(100,10)); 
} 

Mã này kết quả đầu ra "10010" là câu trả lời.

Tôi đã học được rằng chức năng macro gọi đơn giản là sao chép bột nhão mã chức năng macro thay cho cuộc gọi với các đối số được thay thế.

Vì vậy, các mã nên được như:

#include<stdio.h> 
#define f(g,h) g##h 
main() 
{ 
    printf("%d",100##10); 
} 

Nhưng khi tôi thực hiện các mã trên riêng với vĩ mô thay, tôi nhận được một lỗi biên dịch.

Vậy mã đầu tiên cung cấp 10010 làm câu trả lời trong khi mã thứ hai đưa ra lỗi biên dịch như thế nào?

+2

## chỉ hợp lệ INSIDE câu lệnh #define của bạn và có 'không có hiệu lực' trừ khi dòng bắt đầu là '#define [your stuff here]', vì '#define' là những gì hướng dẫn trình biên dịch xử lý phần đó mã đặc biệt. – ActiveTrayPrntrTagDataStrDrvr

+0

'##' đảm bảo các tham số được nối. Do đó: f (100,10) được thay thế bằng bộ tiền xử lý trong: 10010 – Tomas

Trả lời

15

Nhà điều hành ghép nối tiền xử lý ## được thực hiện trước khi macro được thay thế. Nó chỉ có thể được sử dụng trong các cơ quan macro.

+0

Hoàn hảo. Vì vậy, điều đó giải thích tại sao mã thứ hai không hoạt động. Cảm ơn –

1

Nhà điều hành ## có ý nghĩa đặc biệt đối với bộ tiền xử lý, đó là toán tử dán mã thông báo 'gắn hai thẻ' với nhau. Vì vậy, trong trường hợp của bạn, gh được 'dán' cùng nhau, dẫn đến mã thông báo mới - int số 10010.

1

Có một số ký tự đặc biệt như ## trong macro thay đổi quy tắc 'chỉ cần thay thế văn bản'.

Các vấn đề liên quan