Wie kann ich zwei Macro-Parameter mit :: verbinden damit ein voll
qualifizierter Name ensteht?
mit _ geht es aber nicht mit ::
godbolt: https://gcc.godbolt.org/z/TvY7YT
1
// wenn ich hier den Unterstrich durch :: ersetze hagelt es Fehlermeldungen
2
#define FULL_MEMBER( Struct, Member ) Struct ## _ ## Member
3
4
structA
5
{
6
intb;
7
};
8
9
FULL_MEMBER(A,b)// Preprozessor mach daraus A_b, ich hätte gerne A::b
Hintergrund:
ich wollte mir für ein Reverse-Engineering Projekt so ein kleines
Hilfs-Macro für die Analyse schreiben - normalerweise nutze ich keine
Macros aber hier wäre so was schon eine Arbeitserleichterung, wird auch
nicht teil irgendwelchen Produktiv-Codes
cppbert schrieb:> Wie kann ich zwei Macro-Parameter mit :: verbinden damit ein voll> qualifizierter Name ensteht?>> mit _ geht es aber nicht
Hä?
> mit ::
Hä?
> godbolt: https://gcc.godbolt.org/z/TvY7YT> // wenn ich hier den Unterstrich durch :: ersetze hagelt es> Fehlermeldungen> #define FULL_MEMBER( Struct, Member ) Struct ## _ ## Member> struct A
Ja, denn es handelt sich um den "token pasting operator". Der fügt die
beiden Operanden zusammen, so dass sie vom Compiler als ein einzelnes
Wort betrachtet werden. Bei :: darf das aber nicht passieren, denn
Struct, :: und Member müssen drei separte Tokens bleiben, damit der
Compiler was damit anfangen kann. Warum verwendest du den Operator
überhaupt?
so wie oben geht es mit dem clang, gcc und intel - aber nicht mit dem
VS2017 oder VS2019 - mit dem ich arbeite :/
gcc.godbolt: https://gcc.godbolt.org/z/v1GGE6
Alignof funktioniert nur auf einen Typ. Je nach dem was mit dem Wert
bezweckt werden soll müsste man vermutlich das alignment der struct mit
dem offset des members verrechnen. Ich denke mal (ohne besonders darüber
nachgedacht oder nachgesehen zu haben) dass structs automatisch
mindestens das maximum an alignments der members bekommen, also keine
32bit-aligned struct ein 64bit-aligned member haben kann. Von daher -
wozu wäre der Wert gut?
1
#define MEMBER_INFO( Struct, Member ) MemberInfo { #Member, alignof( Struct ), sizeof( Struct :: Member ), offsetof(Struct, Member) }
>Alignof funktioniert nur auf einen Typ.
hab mich verwirren lassen weil clang, gcc und intel das ohne Problem
durchgehen lassen
alignof(decltype(Struct::Member))
sollte dann aber das was ich haben will (mit deiner Korrektur) sein