Подтвердить что ты не робот

Поведение расширения макроса #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;
}
4b9b3361

Ответ 1

Макро расширение происходит после токенизации; он не заменяет текст, а последовательности токенов.

Это означает, что с макросом расширение vi дает токен >, отдельно от того, который следует за вызовом макроса. В каждом случае токенизация находит только один символ >, так что полученный токен.

Без макроса правило "жадного" правила токенизации означало, что два последовательных символа рассматривались как один токен >>, пока С++ 11 не добавил специальное правило для этого случая.