有没有办法编写一个C宏,它将float*
之类的指针类型转换为float_ptr
。
以下示例演示了我想要做的事情:
#define TOT(x) mydata_##x##_t
#define DECLARE(X) typedef TOT(X) { X* p; };
DECLARE(float) // same as typedef mydata_float_t { float* p; };
TOT(float) v; // same as mydata_float_t v;
但是这个代码对指针类型失败了:
DECLARE(float*) // should be typedef mydata_float_ptr_t { float** p; };
TOT(float*) u; // should be mydata_float_ptr_t u;
如何更改TOT
宏来处理*
并将其替换为例如_ptr
?
答案 0 :(得分:3)
这是不可能的。请记住,C预处理器在语义分析之前运行。也就是说,预处理器是一个简单的文本替换引擎,它不了解C语言的任何内容。它不知道*
的含义或指针是什么,不能执行这种翻译。
如果宏语言更复杂,你可以做一些字符串操作并将*
转换为_ptr
或其他东西,但C宏语言并不足以让它成为可能。< / p>
答案 1 :(得分:2)
关于最接近普通C的内容,可以设置一个详尽的C11泛型的类型到名称映射列表。 E.g:
#define TOT(x) _Generic((x), float *: mydata_float_ptr_t, default: mydata_##x##_t)
请不要这样做。
答案 2 :(得分:2)
你不能为指针类型制作单独的maros吗?
#define TOTP(x) mydata_##x##_ptr
#define DECLARE_PTR(X) typedef TOTP(X) { X** p; };
DECLARE_PTR(float) // same as typedef mydata_float_ptr { float** p; };
TOTP(float) v; // same as mydata_float_ptr v;
答案 3 :(得分:0)
C预处理器并不那么聪明;你必须滚动你自己的预处理代码,特别是如果你想要处理诸如指向数组的指针,指向函数的指针,指向返回其他指针的函数的指针数组的指针等等。
咆哮时间......
除非指针语义意味着被隐藏(也就是说,该类型的用户不期望用*
取消引用指针,{{ 1}}或[]
),然后不隐藏typedef名称后面的指针,即使名称中包含->
也是如此。它不会使代码更容易阅读,并且几乎可以保证每次有人使用它时都会追踪至少一个语法错误。