g++编译C代码出错

蔚帆信息 2014-03-11 02:28:36
最近需要移植程序,C++工程中包含C代码,按照extern “C”的方式进行操作,依然无法解决,具体问题如下,部分代码如下:
.h:
#ifndef INIFILEOP_H
#define INIFILEOP_H

#ifdef __cplusplus
extern "C"{
#endif
int FileCopy(void *source_file, void *dest_file);
int SplitSectionToNameIndex(char *section, char **name, char **index);
int JoinNameIndexToSection(char **section, char *name, char *index);

int ConfigGetKey(void *CFG_file, void *section, void *key, void *buf);
int ConfigSetKey(void *CFG_file, void *section, void *key, void *buf);

int ConfigGetSections(void *CFG_file, char *sections[]);

int ConfigGetKeys(void *CFG_file, void *section, char *keys[]);

void INIFileTstmain(void);

#ifdef __cplusplus
}
#endif

#endif


.c
int  ConfigGetSections(void *CFG_file, char *sections[])
{
FILE *fp;
char buf1[MAX_CFG_BUF + 1];
int n, n_sections = 0, ret;


if((fp = fopen(CFG_file, "rb")) == NULL) return CFG_ERR_OPEN_FILE;

while(1)
{
ret = CFG_ERR_READ_FILE;
n = FileGetLine(fp, buf1, MAX_CFG_BUF);
if(n < -1) goto cfg_scts_end;
if(n < 0) break;
n = (int)strlen(strtriml(strtrimr(buf1)));
if(n == 0 || buf1[0] == CFG_nts) continue;
ret = CFG_ERR_FILE_FORMAT;
if(n > 2 && ((buf1[0] == CFG_ssl && buf1[n-1] != CFG_ssr)))
goto cfg_scts_end;
if(buf1[0] == CFG_ssl)
{
buf1[n-1] = 0x00;
strcpy(sections[n_sections], buf1+1);
n_sections++;
}
}
ret = n_sections;
cfg_scts_end:
if(fp != NULL) fclose(fp);
return ret;
}


报错:
INIFileOP.c: In function ‘int ConfigGetSections(void*, char**)’:
INIFileOP.c:574: 错误:从类型‘void*’到类型‘const char*’的转换无效
INIFileOP.c:574: 错误: 初始化‘FILE* fopen(const char*, const char*)’的实参 1

均为g++编译器对类型转换检查较严格导致的问题,采用
gcc编译:gcc -c INIFileOP.c -o testapp -I./ 正常
g++编译:g++ -c INIFileOP.c -o testapp -I./ 报错

g++同gcc在编译阶段不是等价吗,是编译参数错误,还是什么,请指教!

...全文
336 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
百曉生 2014-03-15
  • 打赏
  • 举报
回复
引用 9 楼 aikui0621 的回复:
[quote=引用 8 楼 u012421456 的回复:] 新手路过 这个 char **name 这样两个 * 是什么意思啊?没见过,那位有空解一下惑啊?感激不尽 在这里来占个位置,学习一下
指针的指针,就是传进去了一个指针变量的地址,函数内在这个地址里写入name字符串的首地址传出[/quote] 哦,原来是这样!谢谢啊
蔚帆信息 2014-03-15
  • 打赏
  • 举报
回复
引用 8 楼 u012421456 的回复:
新手路过 这个 char **name 这样两个 * 是什么意思啊?没见过,那位有空解一下惑啊?感激不尽 在这里来占个位置,学习一下
指针的指针,就是传进去了一个指针变量的地址,函数内在这个地址里写入name字符串的首地址传出
百曉生 2014-03-13
  • 打赏
  • 举报
回复
新手路过 这个 char **name 这样两个 * 是什么意思啊?没见过,那位有空解一下惑啊?感激不尽 在这里来占个位置,学习一下
蔚帆信息 2014-03-13
  • 打赏
  • 举报
回复
引用 5 楼 blh 的回复:
[quote=引用 2 楼 aikui0621 的回复:] to blh: 那么就是说要么修改C代码中的类型转换部分,要么就只能用gcc进行编译,g++进行链接喽?
gcc 默认下应该也会提示warning的 这说明编译器觉得那种类型转换坑内存在潜在风险,让你明确写出类型转换,就是让你确认你这个转换是没有问题的 另外,你的ConfigGetSections中的参数为啥定义成void* ?[/quote] 我现在用gcc编译,g++进行链接;原有c代码在gcc下问题还不严重;关于void*这个设计我也很纳闷,原来是以动态库方式链进来,现在我想把这段代码合进来,所以就没改代码;
蔚帆信息 2014-03-13
  • 打赏
  • 举报
回复
引用 3 楼 jiandingzhe 的回复:
你为啥要在函数参数里用void*类型?你分明传进来了一个文件名字符串。这样设计很奇怪。
这段代码是引用现成工具代码,往C++中合并,改动代码量会很大
blh 2014-03-12
  • 打赏
  • 举报
回复
引用 2 楼 aikui0621 的回复:
to blh: 那么就是说要么修改C代码中的类型转换部分,要么就只能用gcc进行编译,g++进行链接喽?
gcc 默认下应该也会提示warning的 这说明编译器觉得那种类型转换坑内存在潜在风险,让你明确写出类型转换,就是让你确认你这个转换是没有问题的 另外,你的ConfigGetSections中的参数为啥定义成void* ?
幻夢之葉 2014-03-11
  • 打赏
  • 举报
回复
1L正解 !
jiandingzhe 2014-03-11
  • 打赏
  • 举报
回复
你为啥要在函数参数里用void*类型?你分明传进来了一个文件名字符串。这样设计很奇怪。
蔚帆信息 2014-03-11
  • 打赏
  • 举报
回复
to blh: 那么就是说要么修改C代码中的类型转换部分,要么就只能用gcc进行编译,g++进行链接喽?
blh 2014-03-11
  • 打赏
  • 举报
回复
if((fp = fopen((const char*)CFG_file, "rb")) == NULL) return CFG_ERR_OPEN_FILE; C++默认会做强类型检查

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧