【问题标题】:Warning C4013: undefined; assuming extern returning int警告 C4013:未定义;假设 extern 返回 int
【发布时间】:2014-02-22 11:38:17
【问题描述】:

我收到另一个警告

C4047: 'initializing' : 'char *' 与 'int' 的间接级别不同。

为什么我会收到这些警告?我在 MSDN 上读到,如果我写了一个与我在头文件中写的不同的函数名,或者它应该是外部函数,它会生成。 有人能解释一下吗?

我的相关代码是:

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

【问题讨论】:

  • 另外,请确保您已为 exit() 函数添加了 #include &lt;stdlib.h&gt;

标签: c


【解决方案1】:

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

#ifndef HEADERFILE_H
#define HEADERFILE_H

#ifndef _ALLOC_MEM_H
#define _ALLOC_MEM_H

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

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

【讨论】:

    【解决方案2】:

    知道发生错误的确切行会很有帮助。我假设它是

    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
    

    【讨论】:

    • 感谢@starrify 的编辑。以后我会使用反引号。
    猜你喜欢
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2013-10-17
    • 2017-12-21
    相关资源
    最近更新 更多