Зачем в определении макросов опытные участники пишут #define all(v) (v).begin(), (v).end(), обрамляя название контейнера в дополнительные скобки? То же самое с переменной в цикле for: #define REP(i,n) for (int (i)=0; (i)<n; (i)++)
В каких случаях это может помочь?
а иначе, могут выползти неожиданные спецэффекты, которые КРАЙНЕ непросто будет отловить.
в любом случае, лучше перестраховаться
#define all(v) v.begin(), v.end()
vector<int> x;
vector<int>* p = &x;
sort(all(*p));
Во втором случае, конечно, скобочки не нужны, но их все равно ставят во всех макросах во избежание досадных неприятностей типа такого:
#define sqr(n) n*n
cout << sqr(3+3)
int c = 3;
REP(i, c>0 ? c : c+1)
cout << i << endl;
vector<int> v;
REP(i,v.size()-1)
так что, на мой взгляд, эти варнинги тупы, приведение адекватное и нужное, и позволяют избежать тупых ошибок с переполнением