【问题标题】:C header file gives error "VERTEX has no member 'p'"C 头文件给出错误“VERTEX 没有成员 'p'”
【发布时间】:2013-12-06 04:49:47
【问题描述】:

我无法让这段代码工作。它在一个文件中运行良好,但是当我将它拆分并放入头文件时,我得到了所有这些错误,例如 (VERTEX has no member p) 和 (VERTEX has no member isVisited);奇怪的是,C 没有错误。我错过了什么?我做错了什么?

#ifndef MY_HEADER_INCLUDED
#define MY_HEADER_INCLUDED

struct EDGETAG;
struct LINKTAG;
//struct VERTTAG;

typedef struct
{
    char c;
    bool isVisited;
    EDGE* p;
} VERTEX;

typedef struct EDGETAG
{
    VERTEX* v;
    struct EDGETAG* q;
} EDGE;



typedef struct LINKTAG
{
    VERTEX* v;
    struct LINKTAG* next;
} VERTLINK;

int main(int argc, char *argv[]);
void bredthfirst(VERTLINK * start, int numVerts);
void depthfirst(VERTLINK * start, int numVerts);
void depthfirst(VERTLINK * start, int numVerts);
void showchart(VERTLINK * start, int numVerts);

#endif

这是一个包含main的文件的简短示例,靠近底部是弹出错误的地方

#include "myheader.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

int main(int argc, char *argv[])//(void)//
{
    FILE* fileAddress;
    int numVerts = 0;//0;
    int temper = 10;
    int * intArray;
    char templine[200];// = " ";//5];// = "  b";

    int getIndex = 0;
    int c = 0;
    int f = 0;
    int exitLoop = 0;
    bool vertfound = false;

    fileAddress = fopen(argv[1],"r");//

    int counter = 0;

    VERTLINK * currentlink;
    VERTLINK firstlink;
    VERTEX * tempvert;
    VERTEX * tempvertoo;
    EDGE * tempedge;
    EDGE * tempedgetoo;
    VERTLINK * templink;
    VERTLINK * templinktoo;
    while(fgets(templine, sizeof(templine), fileAddress) != NULL)
    {
        counter = 0;

         currentlink = &firstlink;

        while(templine[counter] == ' ')
        {
            counter++;
        }
        for(f = 0; f < numVerts; f++)
        {        
            if( (*(*currentlink).v).c == templine[counter])
            {
                vertfound = true;
                f = numVerts + 1;
            }
            else
            {
                if(f < numVerts - 1)// && numVerts != 6)
                {
                currentlink = (*currentlink).next;
                tempvert = (*currentlink).v;
                }


            }
        }
        if(vertfound)
        {vertfound = false;
        }
        else
        {
            if(numVerts == 0)
            {

                tempvert = malloc(sizeof (VERTEX));

                firstlink.v = tempvert;
                firstlink.next = NULL;
                (*firstlink.v).c = templine[counter];
                (*firstlink.v).isVisited = false;
                (*tempvert).p = NULL;

                numVerts++;
            }

这是编译器所说的:

C:\...\CProject\finaldata\myheader.h|13|error: expected specifier-qualifier-list before 'bool'|
C:\...\CProject\finaldata\cgraph.c||In function 'main':|
C:\...\CProject\finaldata\cgraph.c|105|error: 'VERTEX' has no member named 'isVisited'|
C:\...\CProject\finaldata\cgraph.c|106|error: 'VERTEX' has no member named 'p'|
C:\...\CProject\finaldata\cgraph.c|126|error: 'VERTEX' has no member named 'p'|
C:\...\CProject\finaldata\cgraph.c|131|error: 'VERTEX' has no member named 'isVisited'|
C:\...\CProject\finaldata\cgraph.c|149|warning: comparison between pointer and integer|
C:\...\CProject\finaldata\cgraph.c|160|error: 'VERTEX' has no member named 'p'|
C:\...\CProject\finaldata\cgraph.c|164|error: 'VERTEX' has no member named 'p'|
C:\...\CProject\finaldata\cgraph.c|196|error: 'VERTEX' has no member named 'isVisited'|
C:\...\CProject\finaldata\cgraph.c|197|error: 'VERTEX' has no member named 'p'|
C:\...\CProject\finaldata\cgraph.c|221|error: 'VERTEX' has no member named 'p'|
C:\...\CProject\finaldata\cgraph.c|231|error: 'VERTEX' has no member named 'p'|
C:\...\CProject\finaldata\cgraph.c|271|error: 'VERTEX' has no member named 'isVisited'|
C:\...\CProject\finaldata\cgraph.c|273|error: 'VERTEX' has no member named 'p'|
C:\...\CProject\finaldata\cgraph.c|348|warning: implicit declaration of function 'topo'|
C:\...\CProject\finaldata\cgraph.c|361|error: 'VERTEX' has no member named 'p'|
C:\...\CProject\finaldata\cgraph.c|362|error: 'VERTEX' has no member named 'p'|
C:\...\CProject\finaldata\cgraph.c|388|error: 'VERTEX' has no member named 'p'|
C:\...\CProject\finaldata\cgraph.c|390|error: 'VERTEX' has no member named 'p'|
C:\...\CProject\finaldata\cgraph.c|391|error: 'VERTEX' has no member named 'p'|
C:\...\CProject\finaldata\cgraph.c|414|error: 'VERTEX' has no member named 'p'|
C:\...\CProject\finaldata\cgraph.c|415|error: 'VERTEX' has no member named 'p'|
||=== Build finished: 20 errors, 2 warnings ===|

【问题讨论】:

  • 你能显示 C 文件和实际的编译器输出吗?
  • "myheader.h|13|error: expected specifier-qualifier-list before 'bool'" - 显然,您需要解决这个问题。所有其他错误都由此产生。

标签: c struct header


【解决方案1】:
typedef struct
{
    char c;
    bool isVisited;
    struct EDGETAG* p;
} VERTEX;

【讨论】:

  • 谢谢,但我仍然得到相同的结果。我尝试了很多方法,它们都产生了相同的结果
  • @user3051220:您仍然收到p 以上的错误吗?对于bool,您应该包含stdbool.h,并确保您的编译器支持C99(或更高版本)。
【解决方案2】:

myheader.h|13|error: 'bool' 之前的预期说明符限定符列表

在使用 bool 之前,您需要包含 stdbool.h。

您还必须在使用前声明 EDGE。可能还有其他错误,但我没有看。

【讨论】:

    【解决方案3】:

    在 C 中,您需要包含 &lt;stdbool.h&gt; 才能将 bool 定义为类型。

    您还有一对相互递归的类型。您可以通过多种方式声明它们,但我会这样做,使用混合大小写的名称,如 EdgeVertex 代替 EDGEVERTEX

    typedef struct Edge Edge;
    typedef struct Vertex Vertex;
    
    struct Vertex
    {
        char c;
        bool isVisited;
        Edge* p;
    };
    
    struct Edge
    {
        Vertex* v;
        Edge* q;
    };
    

    在定义任一结构之前,将两个结构标记映射到类型名称。

    这也避免了 SHOUTING。将类型 FILEDIR 视为异常。

    另请参阅 Should I use #include in headers?How to structure #includes in C?Linking against a static library 以及其他相关问题。

    【讨论】:

      猜你喜欢
      • 2018-07-02
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多