2010-06-05 61 views
5

tôi cần phải viết như một định nghĩa trong C/C++sử dụng #define trong C/C++

#define scanf(fscanf(inf, 

để thay thế mỗi scanf( với fscanf(inf, văn học

Nhưng tôi không biết làm thế nào ...

Cảm ơn

+8

Chỉ cần nói không với việc sử dụng macro đó. –

+0

@Brian Đó là sự tò mò hơn việc sử dụng ... – Betamoo

+0

C hoặc C++, và trình biên dịch gì? –

Trả lời

11

Bạn muốn sử dụng Variadic macro.

Trong trường hợp của bạn, tôi tin rằng bạn muốn:

#define scanf(...) fscanf(inf,__VA_ARGS__) 
+2

Lưu ý rằng đây không phải là di động. –

+0

Điều này có thể hoạt động. –

+0

@Brian: nó nằm trong bản nháp C++ 0x và được hỗ trợ bởi GNU, Intel và Microsoft, vì vậy ít nhất là trên x86, tôi cho rằng nó đủ di động cho hầu hết các mục đích – Christoph

0

Bạn không thể thay thế một ngoặc đơn. Nếu bạn đang sử dụng Visual C++, thì bạn có thể sử dụng macro Variad để thực hiện những gì bạn muốn:

#define scanf(format, ...) fscanf(inf, format, __VA_ARGS__) 

Trình biên dịch khác có thể có cơ sở tương tự nhưng tôi không quen thuộc với chúng.

+0

Đó là tiêu chuẩn C99. §6.10.3.1 –

+0

Làm tôi ngạc nhiên. Cảm ơn bạn đã làm rõ. –

+0

C99 tiêu chuẩn theo như tôi biết. – ShinTakezou

1

không thể theo cách bạn đã thử tất nhiên.

bạn phải làm những việc như

#define scanf(S, ...) fscanf(inf, S, __VA_ARGS__) 

Xem ví dụ here

CHỈNH SỬA: GNU cpp cũng hỗ trợ các macro variadic; nó là VA_ARGS đứng trước dấu gạch dưới kép và kết thúc với dấu gạch dưới kép ... Tôi phải nghiên cứu đánh dấu thoát ở đây ...

+1

Văn bản xung quanh có dấu gạch chéo ngược để tạo mã nội tuyến. Đó là cách tốt nhất để viết '__VA_ARGS__' ở giữa đoạn văn. ;) –

3

Chỉ cần viết tất cả mã của bạn bằng cách sử dụng fscanf và xác định tên tệp bằng macro như sau:

#ifdef USE_SCANF 
#define SCANF_FILE(file) stdin 
#else 
#define SCANF_FILE(file) file 
#endif 

fscanf(SCANF_FILE(blah), "%d", &a); 
4

tôi cần phải viết như một định nghĩa trong C++

không, bạn không. Những gì bạn thực sự muốn làm là chuyển hướng stdin.

freopen(inf, "r", stdin); 
Các vấn đề liên quan