2015-02-17 12 views
28

Bir değişken bildirimde açılı ayraçları kapattıktan sonra boşluk koymazsak, C++ aşağıdaki hatayı atar.# ++ işaret makro genişletme davranışı C++

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

Ama bu kodda gibi #define kullanırsanız hata gelmiyor. Birisi bunu bana açıklayabilir mi?

Sanırım #define sadece bir makro genişletme ve bul-değiştir gibi çalışıyor, bu nedenle burada her ikisi de değişken bildirme yolları aynı olmalıdır.

Ayrıca, C++ 11 ile derlerseniz bu hata oluşmaz.

#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

C++ 11 '' 'içinde, özel bir kural aracılığıyla geçerli oldu, çünkü alan gereksinimi böyle bir sıkıntıydı. –

+0

Makro'nun neden çalıştığını bilmek ister misiniz? Burada bir soru görmedim. – Aitch

+1

evet Makro'nun neden çalıştığını bilmek istiyorum – Jignesh

cevap

36

Makro genişletme, tokenizasyondan sonra olur; metni değiştirmez, ancak belirteçleri dizileri.

Bu, makroyla birlikte, vi genişlemesinin, makro çağırma işlemini izleyen satırdan ayrı bir > belirtecini verdiği anlamına gelir. Her durumda, belirleme yalnızca bir > karakterini bulur, bu da sonuçta ortaya çıkan belirteçtir.

Makro olmadan, "açgözlü" belirleme kuralı, birbirini izleyen iki karakterin, bu durum için özel bir kural ekleyene kadar tek bir >> belirteci olarak işlem görmesi anlamına gelir.

+8

Bunu daha net görmek için, #define plusi + i 'yi düşünün. Şimdi yazabilirsiniz int int = 0; std :: cout << + plusi'. Ne olduğunu tahmin et ve sonra dene. – MSalters

+2

@MSalters OTOH, bunu üretime sokan herkesin işten çıkarılması gerekiyor –

+0

Bu, düz metin çıkacak olan bir önişlemci programı olan 'cpp' olduğu düşünüldüğünde, biraz mantıksız. Ön işlemenin açıkça önişlemesini, sonradan derlemeyi, derleyicinin önişlemeyi yapmasına izin vermekle aynı olacağını düşünürdüm. – Szabolcs