C宏空白

rsl1atfo  于 2023-01-08  发布在  其他
关注(0)|答案(1)|浏览(93)

我无法完成以下操作,因为在预处理器中空格被忽略(?)。我知道这是标准的一部分,但我想知道是否有一个工作使用可变参数或一些间接的宏技巧。
变量:

#define DECL_INT(name) int #name

DECLR_INT(myValue);
// Expected: int myValue;
// Actual: intmyValue;

结构:

#define ADD_CUSTOM_MEMBERS() \
   C_MEM(IntMember, int) \
   C_MEM(CharMember, char)

#define C_MEM(name, type) type #name;

typedef struct {
   int Stuff;

   ADD_CUSTOM_MEMBERS()
   // Expected: int IntMember;
   //           char CharMember;
} my_struct_t;

我们的目标是拥有一个泛型结构,这样每个应用程序都可以向其中添加自己的成员。
有很多关于空格和宏的信息,但是我还没有看到任何人直接解决这个问题,我已经看到了很多添加前缀的例子。

#define DECL_INT(name) int myPrefix_#name

DECLR_INT(myValue);
// Actual: int myPrefix_myValue;

这样做可以保留intmyValue之间的空格,但我不需要前缀。
假设添加前缀是实现这一点的唯一方法,我不能使用这个技巧来声明一个类型为宏参数之一的变量。

icnyk63a

icnyk63a1#

您有一个错误#。如果没有它:

#define ADD_CUSTOM_MEMBERS() \
   C_MEM(IntMember, int) \
   C_MEM(CharMember, char)

#define C_MEM(name, type) type name;

typedef struct {
   int Stuff;

   ADD_CUSTOM_MEMBERS()
   // Expected: int IntMember;
   //           char CharMember;
} my_struct_t;

gcc -E的输出:

typedef struct {
   int Stuff;

   int IntMember; char CharMember;

} my_struct_t;

相关问题