使用字符串化名称访问结构元素时出现编译错误

Compile errors when accessing a structure element using stringified name

我正在尝试构建一组访问结构元素的函数。我使用 #stringify 预处理器指令构造以元素名称结尾的函数名称,并在这些函数内部访问元素。这将允许调用一堆简单的宏来创建一些非常相似的函数。

编译以下简化示例时,出现编译错误

struct test
{
    float tst;
}test;

// Macro that creates callback functions
#define test_float_(varname) \
void test_float_##varname(void) {\
    test.#varname = 0;\
}

test_float_(tst)
error: expected identifier before string constant
 test_float_(tst)
                ^
../protocol.c:66:8: note: in definition of macro 'test_float_'
  test.#varname = 0;\

如果我删除 test.#varname = 0; 行,错误就会消失。
我在这里做错了什么?

# MacroArgument 从宏参数创建字符串文字。

您的代码:

struct test
{
    float tst;
}test;

// Macro that creates callback functions
#define test_float_(varname) \
void test_float_##varname(void) {\
    test.#varname = 0;\
}

test_float_(tst)

预处理为 (https://gcc.godbolt.org/z/ZkaKaA):

struct test
{
    float tst;
}test;

void test_float_tst(void) { test."tst" = 0;}

test."tst" = 0; 部分显然是语法错误。在 varname 之前丢掉 # 就可以了。

(注意:给予 POSIX C 编译器的 -E 标志导致它只是 运行 预处理器,文本。你会发现它在调试 C 宏时很有用。 )