C 接受位字段值的函数arg使用哪种类型

C 接受位字段值的函数arg使用哪种类型,c,split,byte,bit-fields,C,Split,Byte,Bit Fields,假设我有一个大小为1字节的结构,它由 typedef struct foo { uint8_t fo1:2; uint8_t fo2:3; uint8_t fo3:3; }foo; 然后我想将fo2作为参数传递给函数func\u foo(fo2),但我不知道如何声明该函数,因为fo2实际上没有任何类型。你知道怎么做吗?感谢您提供的任何信息 由于结构成员被声明为uint8\t,因此您将在调用的函数中使用这种类型 void func_foo(uint8_t x); ... foo my

假设我有一个大小为1字节的结构,它由

typedef struct foo
{
  uint8_t fo1:2;
  uint8_t fo2:3;
  uint8_t fo3:3;
}foo;

然后我想将
fo2
作为参数传递给函数
func\u foo(fo2)
,但我不知道如何声明该函数,因为
fo2
实际上没有任何类型。你知道怎么做吗?感谢您提供的任何信息

由于结构成员被声明为
uint8\t
,因此您将在调用的函数中使用这种类型

void func_foo(uint8_t x);
...
foo my_foo = {1, 2, 3};
func_foo(my_foo.fo2);
该参数也可以是任何更宽的类型,例如
int
无符号int
,因为
uint8\u t
可以正确地转换为这些类型


基本上,只需像对待任何其他
uint8\t
结构成员一样对待它们。位字段意味着它们不能保存8位值的完整范围,它将它们全部打包在内存中的一个字节中。但是当您使用这些值时,您不必担心这一点。

您可以使用
uint8\t
。它足够大,即使它比需要的大

void func_foo(uint8_t fo2) {
   printf("%d\n", fo2);
}

foo bar = { 1, 2, 3 };
func_foo(bar.fo2);

我不知道如何声明该函数

它与任何
结构
相同。如果声明
struct bar{int b1;int b2;}
,则不能将
b2
传递给具有
func\u bar(b2)
的函数。您需要创建
struct
的实例,并将该实例的成员传递给函数。您的意思是使用
func\u foo(uint8\u fo2)
来声明函数,并且在实际调用函数时,我可以传递一个3位变量,而不是传递uint8\u t参数?这样做安全吗?我应该记住什么?但是我可以将函数声明为
func\u bar(int b)
,因为我可以向它传递任何int参数,而不是结构中的参数。我放在这里的结构只是为了说明为什么我会有一个3位变量。函数参数的类型可以是任何整数类型(甚至是任何浮点类型),因为编译器会隐式地将
fo2
转换为函数所采用的任何类型。我的猜测是,这是一个标题为X,正文为Y的函数。如果这个猜测是正确的,那么这个问题的答案是:“不要使用位域将字节拆分为位。”