所以,我有一个工会:
typedef union {
int intVal;
char charVal;
bool boolVal;
} myUnion_t;
我有一个函数foo
(与后一个联合文件在同一个文件中)将返回myUnion_t
。
我显然可以做到:
myUnion_t foo(int n){
myUnion_t rtn;
if(n == 0){
rtn.intVal = 1;
} else if(n == 1){
rtn.charVal = 'b';
} else {
rtn.boolVal = false;
}
return rtn;
}
但这很混乱;我的CDO不喜欢它。有没有更好的方法来做到这一点,如:
myUnion_t foo(int n){
if(n == 1){
return 1;
} else if(n == 2){
return 'b';
} else {
return false;
}
}
编辑:好的,工会本质上是凌乱的。感谢您的帮助,我将以正常方式执行此操作:)
答案 0 :(得分:3)
虽然您无法返回union
成员的值来代替union
本身,但您可以使用compound literals of C99来避免在顶部声明union
并设置它在初始化程序之外的字段:
typedef union object_t {
int intVal;
char charVal;
_Bool boolVal;
} object_t;
object_t foo(char ch){
switch(ch) {
case 'a': return (object_t) { .intVal = 4 };
case 'b': return (object_t) { .charVal = 'b' };
default: return (object_t) { .boolVal = true };
}
}
您需要使用复合文字的原因是该类型本身不足以识别您希望分配的union
成员。