2012-06-27 38 views
9

Tôi đã tìm thấy hai thứ khác nhau trong hai cuốn sách nổi tiếng trong c, đầu tiên là "Thông số chính thức không được thay thế trong chuỗi được trích dẫn trong mở rộng macro" - bởi K & Ngôn ngữ R c trang 76mở rộng biến macro trong chuỗi được trích dẫn

thứ hai là một mã số,

#define PRINT(var,format) printf("variable is %format\n",var) 
PRINT(x_var,f); 

gọi vĩ mô sau này sẽ được mở rộng như

printf("x_var is %f\n",x_var); 
  • này là bởi lập trình trong ANSI C - E. balagurusamy ở trang 448.

Chắc chắn hai trích dẫn là một trong những mâu thuẫn với nhau. như xa tôi biết đầu tiên là đúng và trình biên dịch của tôi cho tôi kết quả như vậy. Nhưng cuốn sách thứ hai cũng nổi tiếng và phổ biến. Tôi muốn biết nếu có những điều như vậy trong các phiên bản trước của c hoặc trích dẫn thứ hai là một sai lầm.

+8

Có vẻ như bạn cần loại bỏ một trong những cuốn sách đó. Tôi sẽ để nó cho bạn để đoán xem liệu một trong những để thoát khỏi là một trong đó bao gồm các nhà phát minh của ngôn ngữ như một tác giả hay không. –

+0

Tôi muốn cung cấp cho E.Balagurusamy một số tín dụng - có thể báo giá là không chính xác? – ugoren

+0

Chỉ có thể là một sai lầm khi chỉnh sửa.Sự khác biệt về kích thước sách có thể làm cho điều đó dễ dàng có thể: D – Banjocat

Trả lời

17

Sách thứ hai sai: it is easy to check rằng macro sẽ không được mở rộng như thế. Tuy nhiên, bạn có thể nhận được hiệu quả mà họ mô tả bởi stringizing thẻ sử dụng toán tử # Preprocessor:

#define PRINT(var,format) printf(#var" is %"#format"\n",var) 

Bây giờ bạn có thể in biến của bạn như sau:

int xyz = 123; 
PRINT(xyz, d); 

Đây là a link to a working sample on ideone.

Lưu ý việc thêm dấu ngoặc kép trước và sau '#format' và '#' trước 'var' và 'format'. Toán tử '#' làm cho giá trị của biến được tạo thành chuỗi được trích dẫn - với dấu ngoặc kép của riêng nó. Điều này làm cho các chuỗi được thay thế là bốn chuỗi được trích dẫn liên tiếp, mà trình biên dịch C nhận ra là một yêu cầu nối vào một chuỗi. Vì vậy, các chuỗi: "xyz", "là%", "d" và "\ n" được nối vào: "xyz là% d \ n"

(Lưu ý ví dụ này khác với ví dụ trong câu hỏi gốc trong đó ví dụ orignal có "biến là ..." trong đó câu trả lời được thay thế 'biến' với một thể hiện của đối số macro 'var')

+0

Điều này không hoạt động với một số chuỗi định dạng, chẳng hạn như ''d' để chèn dấu phẩy bằng ngôn ngữ. Tôi đã phải sửa đổi vĩ mô như sau: '#define PRINT (var, định dạng) printf (#var": "format" \ n ", var)', sau đó gọi nó trong mã là 'PRINT (xyz,"% 'd ");'. Điều này cũng cho phép tôi định dạng không gian cho nhiều dòng bằng cách thêm dấu cách trước% char. – AaronCarson

1

Cuốn sách là chính xác. Đã đến lúc rồi. Tôi đã viết một chương trình thử nghiệm nhỏ để xác minh nó (bạn không đánh giá cao soạn thảo văn bản cho đến khi bạn đã được lập trình trong ed):

#define PRINT(fmt,val) printf("val = %fmt\n", (val)) 
main() 
{ 
    int x; 
    x = 5; 
    PRINT(d, x); 
} 

tôi biên soạn nó trên một PDP-11 chạy Unix V6. Chạy chương trình tạo ra sản lượng này:

x = 5 

này thậm chí còn trước K & R C. "tính năng" đã được gỡ bỏ một trong các bước lặp sau của C, và làm chính thức trong ISO C90.

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