2010-03-11 41 views
29

Bạn có thể làm điều gì đó như thế này bằng macro trong C?Macro tiền xử lý C xác định Macro

#define SUPERMACRO(X,Y) #define X Y 

then 

SUPERMACRO(A,B) expands to #define A B 

Tôi có cảm giác không phải vì bộ xử lý trước chỉ thực hiện một lần.

Chỉ gcc chính thức. Không có công cụ của bên thứ ba nào.

Trả lời

23

Macro không thể mở rộng thành chỉ thị tiền xử lý. Từ C99 6.10.3.4/3 "Rescanning và thay thế tiếp tục":

Các kết quả vĩ mô thay thế tiền xử lý chuỗi token được không được xử lý như một chỉ thị tiền xử lý ngay cả khi nó giống như một,

2

Rất tiếc, bạn không thể. Bạn có thể gọi các macro khác trong macro nhưng không thể xác định macro mới.

+0

Nếu bạn làm 2 lần xử lý trước – pm100

+1

Cú pháp không hợp lệ. # là loại ký tự dành riêng trong macro. # phải được theo sau bởi tham số macro là hợp lệ. Điều này sẽ 'xâu chuỗi' tham số. –

3

số hoàn toàn Thứ tự của các hoạt động là như vậy mà tất cả các chỉ thị tiền xử lý được công nhận trước khi bất kỳ mở rộng vĩ mô được thực hiện; do đó, nếu macro mở rộng thành một cái gì đó trông giống như một chỉ thị tiền xử lý, nó sẽ không được công nhận như vậy, nhưng thay vào đó sẽ được hiểu là văn bản nguồn C (sai).

12

Bạn không thể xác định macro trong các macro khác, nhưng bạn có thể gọi macro từ macro của mình, điều này có thể giúp bạn về cơ bản cùng một kết quả.

#define B(x) do {printf("%d", (x)) }while(0) 
#define A(x) B(x) 

vậy, A(y) được mở rộng để do {printf("%d", (y)) }while(0)

0

Bạn có thể thử chạy nó thông qua với chỉ tùy chọn preprocess, sau đó biên dịch với các tập tin xử lý trước.

0

Bạn có thể làm điều này mặc dù: #define SUPERMACRO (X, Y) xác định X Y

Sau đó, bạn có thể sử dụng chức năng biên tập vĩ mô mở rộng của mình và dán vào mất tích #.

Hoặc thậm chí tốt hơn: Sử dụng ngôn ngữ xử lý chuỗi khác, mạnh mẽ hơn làm bộ tiền xử lý của bạn.

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