Powiedzmy, że mamy implementację std::aligned_storage
. Zdefiniowałem dwa makra dla operatorów alignof
i alignas
.Zbyt wiele argumentów dostarczonych do wywołania makropoleceń funkcyjnych
#include <iostream>
#include <cstddef>
#define ALIGNOF(x) alignof(x)
#define ALIGNAS(x) alignas(x)
template<std::size_t N, std::size_t Al = ALIGNOF(std::max_align_t)>
struct aligned_storage
{
struct type {
ALIGNAS(Al) unsigned char data[N];
};
};
int main()
{
// first case
std::cout << ALIGNOF(aligned_storage<16>::type); // Works fine
// second case
std::cout << ALIGNOF(aligned_storage<16, 16>::type); // compiler error
}
W drugim przypadku pojawia się błąd w tytule pytania (kompilacja z Clang, podobny błąd z GCC). Błąd nie występuje, jeśli zastępuję makra odpowiednio alignof
i alignas
. Dlaczego tak jest?
Przed rozpoczęciem pyta mnie, dlaczego to robię - oryginalne makra mają 98 kod zgodny C++, takie jak __alignof
i __attribute__((__aligned__(x)))
a te są specyficzne kompilator, więc makra są moim jedynym wyborem ...
EDYCJA: Tak więc zgodnie z pytaniem oznaczonym jako duplikat dodatkowy zestaw nawiasów rozwiązałby problem.
std::cout << ALIGNOF((aligned_storage<16, 16>::type)); // compiler error
Nie dotyczy. Więc jak miałbym to zrobić? (Pytanie satysfakcjonujące?)
@melpomene, To naprawdę nie daje żadnego sposobu na obejście problemu – chris
Dlaczego? Ponieważ przecinek. - Ekspansja makr widzi przecinek przed ułożeniem syntaktycznego sensu jakiejkolwiek innej zawartości. –
http://stackoverflow.com/questions/679979/how-to-make-a-variadic-macrewar- ny -argumenty mogą być pomocne –