在c中使用enum inside header

时间:2015-06-27 19:09:55

标签: c struct enums header incomplete-type

我在尝试在c中使用头部枚举时遇到了一些麻烦。这是我的代码的样子

的main.c

Error in compilation: /bin/this.program: llvm.ll:4:44: error: '%d' defined with type 'i8'
  %call = call i32 (i8*, ...)* @printf(i8* %d)
                                       ^

listaEstatica.c

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1    {
    class Program
    {
        static void Main(string[] args)
        {
            string input =
            "<Root>" +
            "<mat id=\"4230348\">" +
               "<home id=\"2339086\"/><away id=\"2339218\"/>" +
               "<os/>" +
            "</mat>" +
            "<mat id=\"4230349\">" +
               "<home id=\"2339086\"/><away id=\"2339218\"/>" +
               "<os/>" +
            "</mat>" +
            "<mat id=\"4230350\">" +
               "<home id=\"2339086\"/><away id=\"2339218\"/>" +
               "<os>info</os>. " +
            "</mat>" +
            "<mat id=\"4230351\">" +
               "<home id=\"2339086\"/><away id=\"2339218\"/>" +
               "<os/>" +
            "</mat>" +            
            "</Root>";

            XDocument doc = XDocument.Parse(input);
            var results = doc.Descendants("mat")
               .Select(x => new {
                   matId = x.Attribute("id").Value,
                   homeId = x.Element("home").Attribute("id").Value,
                   awayId = x.Element("away").Attribute("id").Value,
                   os = (string)x.Element("os")
               })
            .ToList();

        }
    }
}
​

listaEstatica.h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "listaEstatica.h"

int main(int argc, char** argv) {
    CACHORRO Tobias;
    strcpy(Tobias.nome, "Tobias");
    Tobias.registro = 123456789;
    Tobias.idade = 6;
    inserir(Tobias);

    exibirCachorro(cachorros[0]);

    return (EXIT_SUCCESS);
}

尝试编译此游戏时出现以下错误

#include "listaEstatica.h"

fim = 0;

enum Porte { Pequeno, Medio, Grande };
enum Estado { Machucado, Doente, DoencaInfeccosa};

int vazia() {
    if (fim == 0) {
        return 1;
    }
    return 0;
}

void inserir(CACHORRO cachorro) {
    if (fim == MAX) {
        printf("Não inseriu %s, lista cheia\n", cachorro.nome);
    } else {
        cachorros[fim] = cachorro;
        fim++;
        printf("Inserido %s OK\n", cachorro.nome);
    }
}

void exibirCachorro(CACHORRO cachorro) {
    printf("Nome: %s\n", cachorro.nome);
    printf("Registro: %i\n", cachorro.registro);
    printf("Idade: %i\n", cachorro.idade);
}

提前致谢,欢迎任何帮助

2 个答案:

答案 0 :(得分:6)

问题是,由于您的代码顺序,您正在使用编译器尚不知道的枚举。

包含字面上只是将头文件的内容复制到.c文件中。因此,在您的情况下,您可以使用这两个枚举进行结构定义,并在枚举的下方定义几行。因此,对于编译器,枚举在到达结构时不存在。

将枚举移动到头文件中并在结构定义之前。

答案 1 :(得分:0)

建议,

在头文件中的typedef之前定义两个枚举类型。

否则,编译器不知道typedef结构定义中两个枚举语句的内容/含义