Поведение расширения макроса #define в С++
Я знал, что если мы не поместим пространство после закрытия угловых скобок в объявлении переменной, С++ выдает следующую ошибку.
‘>>’ should be ‘> >’ within a nested template argument list
Но ошибка не возникает, если я использую #define
, как в этом коде. Может кто-нибудь объяснить мне это?
Я думаю, что #define
является просто расширением макроса и работает как find-replace, поэтому оба способа объявления переменной здесь должны быть одинаковыми.
Также эта ошибка не возникает, если я скомпилирую ее с С++ 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;
}
Ответы
Ответ 1
Макро расширение происходит после токенизации; он не заменяет текст, а последовательности токенов.
Это означает, что с макросом расширение vi
дает токен >
, отдельно от того, который следует за вызовом макроса. В каждом случае токенизация находит только один символ >
, так что полученный токен.
Без макроса правило "жадного" правила токенизации означало, что два последовательных символа рассматривались как один токен >>
, пока С++ 11 не добавил специальное правило для этого случая.