0

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

#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,有什么问题吗?

我这样做的原因

好吧,说实话,我正在阅读其他人编写的代码,而我在帖子中所做的几乎就是某人在我正在阅读的代码中所做的。我什至不敢相信这会奏效,所以我自己尝试一下。此外,我只是使用从代码编译的库,我根本没有编译代码。所以我想知道是否设置了一些编译标志?

更新

应某人的要求,我发布了我看到的代码的屏幕截图,在这里。 在此处输入图像描述

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

4

4 回答 4

2

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

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

同时,在 C 中,这些都没有意义。

于 2012-08-21T06:56:22.160 回答
2

我认为,如果您想要该结构的大小,您可能想要使用sizeof(id),它返回一个 type 的值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 参数的有符号整数类型的指针。

于 2012-08-21T04:54:58.950 回答
0

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

除非类型名称指定 void 类型,否则类型名称应指定原子的、合格的或不合格的标量类型,并且操作数应具有标量类型。

(强调补充。)

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

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

哦,不要定义以下划线开头的标识符;其中大部分保留给实现。age并且name是非常好的名字;无需打电话给他们_age_name

于 2012-08-21T05:27:07.720 回答
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 运算符结果的无符号整数类型;

于 2012-08-21T05:00:00.787 回答