C++ 在C+中定义填充成员+;

C++ 在C+中定义填充成员+;,c++,C++,有没有一种方法可以在结构内部使用宏填充,我的意思是: struct Monument{ char name[32]; PADDING( 4 * sizeof(int)); int cityId; PADDING( 4 * sizeof(int)); int age; } #define TOKENPASTE(x, y) x ## y #define TOKENPASTE2(x, y) TOKENPASTE(x, y) #define PADDING(s

有没有一种方法可以在结构内部使用宏填充,我的意思是:

struct Monument{
    char name[32];
    PADDING( 4 * sizeof(int));
    int cityId;
    PADDING( 4 * sizeof(int));
    int age;

}
#define TOKENPASTE(x, y) x ## y
#define TOKENPASTE2(x, y) TOKENPASTE(x, y)
#define PADDING(size) char TOKENPASTE2(padding_, __LINE__) [size]

其中PADDING(s)宏只添加了空格。

您可以这样定义它:

struct Monument{
    char name[32];
    PADDING( 4 * sizeof(int));
    int cityId;
    PADDING( 4 * sizeof(int));
    int age;

}
#define TOKENPASTE(x, y) x ## y
#define TOKENPASTE2(x, y) TOKENPASTE(x, y)
#define PADDING(size) char TOKENPASTE2(padding_, __LINE__) [size]
根据需要更改字段名前缀(最好是永远不会更改的前缀) 与其他可能的成员碰撞)

请记住(如Remy Lebeau和François Andrieux在评论中提到的),编译器有时会添加意外的填充。作为参考,您可以阅读:


编辑:抱歉,初始代码不正确(在宏中使用
\uuuuu行\uuuu
展开时不正确)。我使用以下解决方案修复了它:

在实现THESS宏后,请确保编译器没有向结构添加额外的填充。对我来说,听起来像是X-Y问题。@Zereges:不一定。在某些情况下(通常是一些互操作情况),成员之间的填充应该明确指定,而不是由编译器控制。另外,请确保将结构对齐设置为1字节,以便编译器不会在成员之间添加自己的填充。@FrançoisAndrieux我的错误,谢谢!我已经修正了。我建议你说C++有时会添加意想不到的填充。例如,由于对齐限制,
填充(1)int
之间的code>实际上会引入超过1字节的填充。有时也很难说编译器会对其执行什么操作。请参阅。我将使用pack方法,因为我不知道gcc是否在64位上以8填充,但我定义的结构始终遵循4字节模式。你能解释一下#和##是如何工作的吗?
###
在文本级别合并了两个参数(因此填充##20在生成的代码中变成了填充#20)。由于宏的工作方式(padding####LINE将扩展为padding_#LINE),因此需要额外级别的宏(TOKENPASTE和TOKENPASTE2)。有关详细信息,请阅读以下答案: