警告C4013:未定义;假设extern返回int

时间:2014-02-22 11:38:18

标签: c

我收到另一个警告

  

C4047:'初始化':'char *'的间接级别与'int'不同。

为什么我会收到这些警告?我已经在MSDN上读过,如果我写了一个与我在头文件中写的不同的函数名,它应该是extern函数。 有人可以对此有所了解吗?

我的相关代码是:

GetSignature.c

#include "Parse_Database.h"
#include "Alloc_Mem.h"
#include "Get_Signature.h"


int Get_Signature(const char *filename) {
    char *database = AllocMem(filename);
    int error=0;

    //ParseDatabase(database);

    return 1;
}

AllocMem

#include "Alloc_Mem.h"


char *AllocMem(const char *filename)    {
    FILE *fp = NULL;
    int ch = EOF;
    char *buf = NULL, *tmp = NULL;
    unsigned int size=0, index=0;

    /*
        Mallicous use of fopen(anyone could replace filename with a malicous modified file)
    */
    fp = fopen(filename, "r");
    if(fp == NULL)  {
        fprintf(stderr, "Can't open the signature database");
        exit(1);
    }

    while(ch)   {
        fread(&ch, 1, 1, fp);

        if(ch == EOF)   {
            ch = 0;
        }

        if(size <= index)   {
            size+=chunk;
            tmp = realloc(buf, size);
            if(!tmp)    {
                free(buf);
                buf = NULL;
                break;
            }
            buf = tmp;
        }

        buf[index++] = ch;
    }

    fclose(fp);
    return buf;
}

Alloc_Mem.h

#ifndef HEADERFILE_H
#define HEADERFILE_H

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

#define chunk 255

#include <stdio.h>
#include <stdlib.h>

char *AllocMem(const char *);

#endif

2 个答案:

答案 0 :(得分:2)

我想这会解决你的问题:替换这些行:

#ifndef HEADERFILE_H
#define HEADERFILE_H

#ifndef _ALLOC_MEM_H
#define _ALLOC_MEM_H

原因:每个头文件的标头保护应该是唯一的,否则在包含多个头文件时会出现损坏。 (我猜你在所有的头文件中都使用相同的名称。)

已编辑:在其他标题(Parse_Database.hGet_Signature.h)中,您还应使用不同的名称替换标题保护。

答案 1 :(得分:1)

了解错误发生的确切行将会很有帮助。我假设它是

char *database = AllocMem(filename);
GetSignature.c中的

通常,出现此错误是因为C编译器在调用时没有函数声明(哪个函数取决于错误消息中提到的行)。发生这种情况时,C编译器假定该函数返回int

你有包含警卫吗?

#ifndef HEADERFILE_H
#define HEADERFILE_H

Parse_Database.h中也是如此?如果是,则阻止声明AllocMem被包括在内,因为HEADERFILE_H已经定义。

通常的自定义是将定义的宏命名为与头文件相同。例如:

#ifndef ALLOC_MEM_H
#define ALLOC_MEM_H