使用字符串化名称访问结构元素时出现编译错误
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 宏时很有用。 )
我正在尝试构建一组访问结构元素的函数。我使用 #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 宏时很有用。 )