2012-05-02 43 views
44

Làm thế nào để tạo macro tiền xử lý đa dòng? Tôi biết làm thế nào để làm cho một dòng:Macro đa dòng tiền xử lý

#define sqr(X) (X*X) 

nhưng tôi cần một cái gì đó như thế này:

#define someMacro(X) 
    class X : public otherClass 
    { 
     int foo; 
     void doFoo(); 
    }; 

Làm thế nào tôi có thể có được điều này để làm việc?

Đây chỉ là một ví dụ, macro thực có thể rất dài.

+0

Bạn có thể dễ dàng nhận được câu trả lời bằng cách tìm kiếm SO. ví dụ. http://stackoverflow.com/questions/4007865/few-questions-about-the-c-preprocessor – CppLearner

+0

các phương pháp khác nhau có tại đây: http://www.parashift.com/c++-faq/macros-with-multi-stmts .html – Ayrat

+0

Liên quan: http://stackoverflow.com/questions/98944/how-to-generate-a-newline-in-a-cpp-macro –

Trả lời

79

Bạn sử dụng \ làm ký tự thoát dòng liên tục.

#define swap(a, b) {    \ 
         (a) ^= (b); \ 
         (b) ^= (a); \ 
         (a) ^= (b); \ 
        } 

EDIT: Như @abelenky chỉ ra trong các ý kiến, các nhân vật \phải là ký tự cuối cùng trên dòng. Nếu nó không phải là (ngay cả khi nó chỉ là không gian màu trắng sau đó), bạn sẽ nhận được thông báo lỗi khó hiểu trên mỗi dòng sau khi nó.

+27

Một lời cảnh báo: Hãy chắc chắn rằng \ là ** cuối cùng * * ký tự trên dòng. Trong C, khoảng trắng thường không quan trọng, nhưng trong trường hợp này, khoảng trống vô hình ở cuối dòng có thể giết bạn. – abelenky

+0

@abelenky: Tốt, cảm ơn. –

+2

Bạn nên thêm văn bản kết quả đó vào một dòng. Bởi vì C xử lý tất cả các khoảng trắng giữa các thẻ giống nhau nên nó thường không quan trọng lắm, nhưng vẫn vậy. –

11

Bạn có thể tạo một khoảng vĩ mô nhiều dòng bằng cách đặt một dấu chéo ngược (\) vào cuối mỗi dòng:

#define F(x) (x) \ 
       * \ 
      (x) 
+5

+1: vì không bỏ lỡ các dấu ngoặc xung quanh 'x'! -) – alk

2

Bạn cần phải thoát khỏi dòng mới vào cuối dòng bằng cách thoát khỏi nó với một \:

#define sqr(X) \ 
     ((X)*(X)) 
10

XIN LƯU Ý như Kerrek SB và coaddict chỉ ra, mà lẽ ra phải được chỉ ra trong câu trả lời được chấp nhận, LUÔN LUÔN đặt dấu ngoặc ôm xung quanh đối số của bạn. Ví dụ sqr là ví dụ đơn giản được dạy trong các khóa học CompSci.

Đây là vấn đề: Nếu bạn xác định nó theo cách bạn đã làm những gì xảy ra khi bạn nói "sqr (1 + 5)"? Bạn nhận được "1 + 5 * 1 + 5" hoặc 11
Nếu bạn đặt dấu ngoặc ôm đúng cách, #define sqr(x) ((x)*(x))
bạn nhận được ((1 + 5) * (1 + 5)) hoặc những gì chúng tôi muốn 36 ... đẹp.

Ed S. sẽ có cùng một vấn đề với 'hoán đổi'

+0

làm thế nào về' sqr (++ i) '? (giả sử chúng ta có 'int i') :) –

+0

Tôi đã làm nó như một bài tập và rõ ràng' i' được tăng lên khi nó được thay thế thành macro (trong trường hợp này nó được thay thế hai lần), sau đó nó được nhân lên.Vì vậy, 'sqr (++ 5) == ((7) * (7))' – jiveturkey

+1

@ GézaTörök Việc mở rộng 'sqr (++ i)' thành '((++ i) * (++ i))' sẽ gọi hành vi không xác định bởi vì giá trị của 'i' được sửa đổi nhiều hơn một lần trong câu lệnh đó (không có điểm chuỗi giữa các phép toán). – moooeeeep

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