【问题标题】:Using typeof to convert a variable declaration to a type?使用 typeof 将变量声明转换为类型?
【发布时间】:2013-05-31 16:20:44
【问题描述】:

目前,我有一个很像这样的场景:

#define my_macro(var) __builtin_types_compatible_p(typeof(var), foo) ? do_something : do_something_else

但是,宏无意中被传递了这个参数:

my_macro(int x);

当然失败了,因为typeof(int x) 无效。

我可以在my_macro 中应用一个转换,这将允许typeof 处理该表达式吗?我无法更改传递给宏的内容,只能更改宏内部发生的内容。

所以,是这样的:

#define my_macro(var) typeof(?? var ??)

或者,我应该在这里使用其他表达式吗?

【问题讨论】:

  • 我会说“不”,虽然很明显否定的结果有点难以证明;)
  • @OliCharlesworth 我担心...我知道我可以使用decltype 来做到这一点,但我真的想在这里避免使用 C++。

标签: c gcc c-preprocessor typeof


【解决方案1】:

好吧,我找到了一种方法,使用另一个 GCC 扩展,这次是语句表达式:

#define my_typeof(definition) typeof(({ definition, _def; _def; }))

当然,扩展为:

typeof(({ int x, _def; _def; }))

很丑,但我为什么在乎?它有效。

【讨论】:

  • @OliCharlesworth 很好。看看是否存在适用于指针的解决方案会很有趣。
【解决方案2】:

您可以分别处理xint x,但要使用一个宏处理这两者,您需要能够在C 预处理器中解析/分隔以空格分隔的参数。据我所知,C 预处理器中不存在这样的支持。如果没有这样的解析能力,你必须找到一些其他聪明的方法来编写一个绕过这个限制的宏,例如,在以下代码示例中本着 my_macro2() 的精神:

#include <stdio.h>

#define my_macro1(var) \
do { \
   typeof(var) blah; \
   printf("sizeof(var)=%d\n", sizeof(blah)); \
} while(0)

#define my_macro2(var) \
do { \
   var, newvar_sametype; \
   typeof(newvar_sametype) blah; \
   printf("sizeof(newvar_sametype)=%d\n", sizeof(blah)); \
} while(0)


int
main()
{
   int x;
   my_macro1(x);
   my_macro2(char y);

   return 0;
}

【讨论】:

  • 这很简洁,但请注意my_macro2 不能正确用于指针类型。
猜你喜欢
  • 1970-01-01
  • 2012-06-26
  • 2010-12-22
  • 2016-07-03
  • 2016-01-19
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多