在结构上使用size_t进行无效的类型转换

时间:2012-08-21 04:50:35

标签: c type-conversion

我正在尝试做这样的事情,

#include <stdio.h>

typedef struct Id {
    int _age;
    char _name[10];
} Id;

int main()
{
    Id id = {10, "logan"};
    printf("%u\n", (size_t)id);  // Here is the problem.
}

以上代码无法通过gcc编译,有什么不对吗?

我之所以这样做

嗯,说实话,我正在阅读别人写的代码,而我在帖子中所做的几乎就是有人在我正在阅读的代码中所做的事情。我甚至不相信这会奏效,所以我自己就试试吧。而且,我只是使用从代码编译的lib,我根本不编译代码。所以我想知道是否设置了一些编译标志?

更新

根据某人的要求,我发布了我看到的代码的截图,就在这里。 enter image description here

在此template中,我说_Key可能是用户定义的struct

4 个答案:

答案 0 :(得分:2)

我认为,如果您想要该结构的大小,您可能需要使用sizeof(id),它返回size_t类型的值。

您目前正在尝试做的是将该结构转换为size_t类型,如果有的话,它将无法正常工作: - )

换句话说:

printf("%zu\n", sizeof(id));  // Here is the solution.

此外(正如您所注意到的),打印size_t值的标准祝福方式是使用z修饰符:

  

z :指定以下d,i,o,u,x或X转换说明符适用于size_t或相应的有符号整数类型参数;或者后面的n转换说明符适用于指向与size_t参数对应的有符号整数类型的指针。

答案 1 :(得分:2)

您发布的屏幕截图struct xhash代码是C ++代码,而不是C代码。

然而,虽然通常可以使其适用于C ++中的类类型,但我仍然非常怀疑这个C ++代码甚至应该与类类型一起使用。我猜想发布的C ++ struct xhash实现旨在用作标量类型的“后备”实现,而类类型则需要为散列函数提供自己的实现(通过例如,使用模板特化机制,或者为自己定义完全不同的散列函子。

与此同时,在C中,这一切都没有意义。

答案 2 :(得分:0)

更新基思的评论:

如果你想打印年龄,你可以(但行为没有定义,只是实现特定的黑客)

 int main() 
{     Id id = {10, "logan"}; 
    printf("%u\n", *((size_t*)((void*)&id)));  
}

要打印ID的大小,(返回的类型是size_t)

 int main() 
{     Id id = {10, "logan"}; 
    printf("%u\n",sizeof(id));  
}

在标题中加入 stddef.h

C将size_t定义为: -

  

size_t这是sizeof结果的无符号整数类型   操作者;

答案 3 :(得分:0)

struct Id是一种结构类型。 size_t是整数类型。没有从struct类型到整数类型的转换。请参阅N1570 6.5.4p2,“演员”:

  

除非类型名称指定void类型,否则类型名称应为   指定原子,限定或非限定标量类型,和操作数   应具有标量类型。

(强调补充。)

可以想象编译器可能支持这种转换作为语言扩展,但这不太可能;我想不出任何合理的语义。

重新检查您正在使用的代码。要么它不编译(你需要解决这个问题),要么它编译,因为它并没有真正进行那种转换。

哦,不要定义以下划线开头的标识符;其中大部分都保留给实施。 agename是非常好的名字;无需呼叫_age_name