我收到另一个警告
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
答案 0 :(得分:2)
我想这会解决你的问题:替换这些行:
#ifndef HEADERFILE_H
#define HEADERFILE_H
与
#ifndef _ALLOC_MEM_H
#define _ALLOC_MEM_H
原因:每个头文件的标头保护应该是唯一的,否则在包含多个头文件时会出现损坏。 (我猜你在所有的头文件中都使用相同的名称。)
已编辑:在其他标题(Parse_Database.h
和Get_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