Supponiamo di avere un'implementazione di std::aligned_storage
. Ho definito due macro per gli operatori alignof
e alignas
.Troppi argomenti forniti per l'invocazione di macro come funzione
#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
}
Nel secondo caso ottengo l'errore nel titolo della questione (la compilazione con Clang, errore simile con GCC). L'errore non è presente se sostituisco le macro con alignof
e alignas
rispettivamente. Perché è questo?
Prima di iniziare a me perché sto facendo questo chiedendo - le macro originali hanno codice compatibile C++ 98, come __alignof
e __attribute__((__aligned__(x)))
e questi sono compilatore specifico, in modo macro sono la mia unica scelta ...
MODIFICA: Quindi, in base alla domanda contrassegnata come duplicata, una serie aggiuntiva di parentesi risolverebbe il problema.
std::cout << ALIGNOF((aligned_storage<16, 16>::type)); // compiler error
Non funziona. Quindi, come potrei fare questo? (Domanda soddisfacente?)
@melpomene, che non dà davvero alcun modo di aggirare il problema – chris
Perché? Perché virgola. - L'espansione macro vede la virgola prima di dare un senso sintattico a qualsiasi altro contenuto –
http://stackoverflow.com/questions/679979/how-to-make-a-variadic-macro-variable-number-of-arguments può essere utile –