如何区分联盟的内容

时间:2013-06-29 20:56:48

标签: c unions

我只是想知道,如果我有一个接受包含其中的union的结构的函数,我怎么能知道该联合的内容:

struct command{
  int *input;
  int *output;
  union{
    char **word;
    struct command *subcommand;
  } u;
 };

功能:

void readCommand(command cInput){
    if(cInput.u is char) print the content of array of array of char
    else readCommand(cInput.u); //make a recursive call
}

有什么建议吗?谢谢

注意:我无法更改struct命令的内容。

4 个答案:

答案 0 :(得分:0)

你做不到。这就是工会的本质。如果需要,必须在结构中嵌入union,并在结构中放置一个类型指示符。

答案 1 :(得分:0)

你不能;您必须假设基础数据是什么或有权访问其他信息,这些信息可以告诉您当前的基础类型是什么。它只对提取适当的基础类型有效。

答案 2 :(得分:0)

如果您从黑盒子中收到此类型的对象而没有关于此对象的任何信息,则在不更改struct command结构的情况下无法执行此操作。

答案 3 :(得分:0)

对于工会,你总是需要某种鉴别器来表明哪个特定的对象存在于联盟中。它可以是枚举或其他值,告诉您对象的性质。

例如:

struct command{
  int *input;
  int *output;
  int type; // <-- e.g. this value is the union discriminator; 1 => word, 2 => subcommand
  union{
    char **word;
    struct command *subcommand;
  } u;
 };