如何编写一个将float *转换为float_ptr的C宏?

时间:2013-12-27 16:53:58

标签: c macros

有没有办法编写一个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

4 个答案:

答案 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名称后面的指针,即使名称中包含->也是如此。它不会使代码更容易阅读,并且几乎可以保证每次有人使用它时都会追踪至少一个语法错误。