2015-02-17 17 views
28

Tôi biết rằng nếu chúng ta không đặt dấu cách sau khi đóng dấu ngoặc nhọn trong một khai báo biến, C++ ném lỗi sau đây.Hành vi của việc mở rộng macro #define trong C++

‘>>’ should be ‘> >’ within a nested template argument list

Nhưng lỗi không đến nếu tôi sử dụng #define như trong mã này. Ai đó có thể giải thích cho tôi điều này?

Tôi nghĩ #define chỉ là bản mở rộng macro và hoạt động như tìm-thay thế, vì vậy cả hai cách khai báo biến ở đây phải giống nhau.

Ngoài ra lỗi này không xảy ra nếu tôi biên dịch nó bằng C++ 11.

#include <bits/stdc++.h> 
using namespace std; 

#define vi vector<int> 

int main(){ 
    //Doesn't work, compile error 
    vector<vector<int>> v; 

    //Works 
    vector<vi> vv; 
} 
+15

Trong C++ 11 '>>' trở thành hợp lệ, thông qua một quy tắc đặc biệt, bởi vì yêu cầu về không gian là một sự khó chịu. –

+0

Bạn muốn biết, tại sao macro hoạt động? Tôi không thấy câu hỏi ở đây. – Aitch

+1

vâng tôi muốn biết tại sao macro hoạt động – Jignesh

Trả lời

36

Mở rộng macro xảy ra sau khi mã hóa; nó không thay thế văn bản, mà là chuỗi các thẻ.

Điều này có nghĩa rằng, với macro, việc mở rộng vi cấp mã thông báo >, tách biệt với mã theo sau lệnh gọi macro. Trong mỗi trường hợp, tokenisation chỉ tìm thấy một ký tự > duy nhất, vì vậy đó là mã thông báo kết quả.

Không có macro, quy tắc mã hóa "tham lam" nghĩa là hai ký tự liên tiếp được coi là một mã thông báo >> duy nhất, cho đến khi C++ 11 thêm quy tắc đặc biệt cho trường hợp này.

+8

Để xem điều này rõ ràng hơn, hãy xem xét '#define plusi + i'. Bây giờ bạn có thể viết 'int i = 0; std :: cout << + plusi'. Dự đoán những gì xảy ra và sau đó thử. – MSalters

+2

@MSalters OTOH, bất cứ ai đưa vào sản xuất cần phải được sa thải –

+0

Đây là một chút phản trực giác xem xét rằng có một chương trình tiền xử lý riêng biệt, 'cpp', sẽ xuất văn bản thuần. Tôi đã giả định rằng tiền xử lý một cách rõ ràng, sau đó biên dịch sau đó, sẽ giống như việc cho phép trình biên dịch tự thực hiện việc xử lý trước. – Szabolcs

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