Angenommen, wir haben eine Implementierung von std::aligned_storage
. Ich habe zwei Makros für die Operatoren alignof
und alignas
definiert.Zu viele Argumente für einen funktionsähnlichen Makroaufruf
#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
}
Im zweiten Fall habe ich den Fehler in dem Titel der Frage (mit Clang, ähnlichen Fehlern mit GCC kompilieren). Der Fehler ist nicht vorhanden, wenn ich die Makros durch alignof
bzw. alignas
ersetze. Warum ist das?
Bevor Sie beginnen, mich zu fragen, warum ich das tue - die ursprünglichen Makros C++ 98 kompatiblen Code wie __alignof
und __attribute__((__aligned__(x)))
und die sind Compiler spezifisch, so Makros meine einzige Wahl sind ...
EDIT: Also nach der Frage als doppelt markiert, würde eine zusätzliche Klammer setzen das Problem beheben.
std::cout << ALIGNOF((aligned_storage<16, 16>::type)); // compiler error
Es tut es nicht. Also, wie würde ich das tun? (Erfüllbare Frage?)
@melpomene, geben wird, die nicht wirklich eine Möglichkeit, um das Problem der Arbeits – chris
Warum? Weil Komma. - Makroexpansion sieht das Komma vor dem syntaktischen Sinn eines anderen Inhalts –
http://stackoverflow.com/questions/679979/how-to-make-a-variadic-macro-variable-number-of-arguments kann hilfreich sein –