【问题标题】:what is the return type of typeof?typeof 的返回类型是什么?
【发布时间】:2010-07-16 14:07:30
【问题描述】:

我想将元素的类型作为参数提供给指向未知类型元素的指针数组的初始化

类似

void* init(type t)
  void* array = malloc(sizeof_type(t)*10));
  return array;
}

然后再调用例如

   init(typeof(int))

但我不知道 typeof 的返回类型是什么。

我猜想使用sizeof_type可以实现

   malloc((type) 0);

提前致谢

PS:如果有人可以为我指出一些灵活的代码,我也将非常感谢

【问题讨论】:

标签: c gcc typeof


【解决方案1】:

我通常不使用gnu(我认为它只是在gnu C中),但我认为它不是正常意义上的表达式,您可以将其值分配给变量并稍后使用它。我认为它只能作为一种类型在非常特定的上下文中使用。

From the docs:

这个关键字的使用语法 看起来像 sizeof,但结构 在语义上类似于类型名称 用 typedef 定义。

可以使用 typeof-construct 任何可以使用 typedef 名称的地方。 例如,您可以在 声明,在演员表中,或在 sizeof 或 typeof。

【讨论】:

  • 很高兴我能做到typeof(typeof(typof(typeof(c)))) 并且它和typeof(c) 一样;-)
  • 谢谢,所以这可能是不可能的。这基本上意味着我必须提供原型元素而不是类型
【解决方案2】:

为什么不能只使用 sizeof? 类似:

int c;
void *p = calloc( 10,sizeof(c) );

【讨论】:

    【解决方案3】:

    你想要的都是不可能的。

    typeof() 并不真正返回类型,因为它是在编译时 评估的关键字。它被其参数类型的名称替换。

    也许你可以 你不能使用预处理器的字符串化操作符把它变成一个字符串,像这样##typeof(a),但是它仍然会当您在字符串中有类型时,不可能 malloc/cast 某些东西。

    【讨论】:

    • 1.字符串化不起作用,因为 typeof() 无法在预处理阶段进行评估。你只会得到字符串“typeof(a)”来解决你的麻烦。
    • 2. “##”实际上是标记粘合,而不是字符串化。
    • +1。并删除最后一段,没有任何意义。从你所说的 typeof() 是在编译时评估的,那么对于预处理器技巧来说为时已晚。
    【解决方案4】:

    这个:

    #define INIT(t) (malloc(sizeof(t) * 10))
    

    可以这样使用:

    int* a = INIT(int);
    

    或者可能是这样的:

    void* b = INIT(typeof(c));
    

    甚至这个:

    void* b = INIT(c);
    

    sizeof(c) == sizeof(typeof(c)).

    【讨论】:

    • 甚至void * b = INIT(c) as sizeof 接受一个变量(就像有一个隐含的typeof
    【解决方案5】:

    我知道您的问题没有被标记为这样,但如果您碰巧能够使用 C++,您可能需要考虑使用模板类。像 STL 这样的库使用模板来提供(类型)通用容器和算法。

    http://www.cplusplus.com/doc/tutorial/templates/

    http://en.wikipedia.org/wiki/Template_%28programming%29

    【讨论】:

      【解决方案6】:

      您可以为此使用宏:

      #define INIT(t) ((t*) init_1(sizeof(t)))
      
      void *init_1(size_t sz) {
        void *array = malloc(sz * 10);
        return array;
      }
      

      然后你使用like:

      int *array = INIT(int);
      

      【讨论】:

      • 没有理由强制转换结果。只需将void * 用于它的用途。 (请参阅认为有害的 malloc 的返回值。)
      • @R.. 在这种情况下你错了。仔细看一下,我不是转换 malloc() 的返回值,所以你的担忧在这里不适用。我正在转换 init_1() 的返回值,以便表达式具有适当的类型。这很重要,以便编译器标记错误,例如将INIT(int) 分配给char*。在 malloc() 返回中不使用强制转换的目的是防止编译器使用返回 int 并强制转换为指针类型的隐式 malloc() 声明,这会导致 UB。
      • 请注意,由于我实际上并没有强制转换 malloc() 的返回值,因此如果用户忘记包含 ,编译器将发出警告,将 int 转换为指针malloc() 的行。 #define 行中的类型转换是无害的,因为 init_1() 的定义在那里,编译器知道该函数返回一个指针,并且转换执行安全指针到指针转换并导致表达式具有正确的类型.
      猜你喜欢
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      • 2018-04-04
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多