2004年c语言编译器10大最不知所措的问题之一
大家好,我用的是pro c,你们应该知道吧?就是可以在c语言里面直接编写sql语句的那种语言
大概的情况是这样,我只发出了程序的一部分,这个程序common.pc是一个公用函数的说明集合,里面说明了我以后程序要用到的一些公共函数
说明。
EXEC SQL BEGIN DECLARE SECTION;
varchar sql_user[20]; /* 连接到oracle的用户名*/
varchar sql_pass[20]; /* 连接到oracle的口令 */
varchar sql_servName[10]; /* 连接到oracle的 服务名*/
char sql_servLink[10]; /* 连接到oracle的 连接池*/
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE sqlca;
/*下面是一个公共的sql语句的报错处理*/
int sqlErr(void)
{
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("\nOracle error detected:%70s\n", sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK WORK RELEASE;
exit(-1);
}
/*下面是一个得到一个数据库表中的时间的小函数*/
/*函数功能:从数据库上取出上一次成功生成指定省的某类数据文件的时间*/
/*函数输入:传入要保存时间的字符串地址,联通综合营帐系统省代码和文件类型代码*/
/*函数输出:返回取出的时间串的长度*/
int getUpdateTime(char *pchLastTime, char *pchProvCode, char *pchFileType)
{
EXEC SQL BEGIN DECLARE SECTION;
varchar sql_provCode[4];
varchar sql_fileType[4];
varchar sql_lastTime[15];
EXEC SQL END DECLARE SECTION;
memset(&sql_provCode, 0, sizeof(sql_provCode));
memset(&sql_fileType, 0, sizeof(sql_fileType));
memset(&sql_lastTime, 0, sizeof(sql_lastTime));
assert((pchProvCode != NULL) && (pchFileType != NULL) && (pchLastTime != NULL));
strcpy(sql_provCode.arr, pchProvCode);
sql_provCode.len = strlen(sql_provCode.arr);
strcpy(sql_fileType.arr, pchFileType);
sql_fileType.len = strlen(sql_fileType.arr);
EXEC SQL WHENEVER SQLERROR do sqlErr();
EXEC SQL AT :sql_servLink SELECT LAST_SEND_TIME INTO :sql_lastTime FROM SVCM_INTER_CONFIG
WHERE PROVINCE_CODE=:sql_provCode AND FILE_TYPE_CODE=:sql_fileType;
strcat(sql_lastTime.arr, "\0");
strncpy(pchLastTime, sql_lastTime.arr, TIME_LEN);
return(TIME_LEN);
}/*假设这是第100行*/
这个getUpdateTime函数是以前我自己写的,在编译common.pc程序过程中没有出现任何错误,而且这一套程序一直用了一年了,但是最近我为
了实现一些新的需求,就准备修改修改,我怎么修改我就不罗嗦了,我做了这样一个操作,把getUpdateTime这个函数用/**/符号封了,然后在
紧接着100后面敲了一个回车,然后把getUpdateTime程序再复制在102行上,一模一样,绝对不修改,然后编译,出现的错误是:
common.c:2623: error: break statement not within loop or switch
大家是不是在疑问这个common.c文件是什么东西,common.c就是gcc这个编译器把我写的common.pc这个pc程序编译成纯c的程序,因为在pc中的
EXEC SQL BEGIN DECLARE SECTION;
varchar sql_provCode[4];
varchar sql_fileType[4];
varchar sql_lastTime[15];
EXEC SQL END DECLARE SECTION;
EXEC SQL WHENEVER SQLERROR do sqlErr();
EXEC SQL AT :sql_servLink SELECT LAST_SEND_TIME INTO :sql_lastTime FROM SVCM_INTER_CONFIG
WHERE PROVINCE_CODE=:sql_provCode AND FILE_TYPE_CODE=:sql_fileType;
这些东西c语言是不认识的,c语言里面必须把所有和sql语句有关的包括变量说明全部都要转化,比如sql语言里面的varchar在c里面就会转化
为一个结构体的格式
我把出错和没有出错的common.pc程序编译以后生成的中间文件common.c唯一不同的地方的一段代码发出来大家看看
这个是没有出错的common.c文件中的getUpdateTime这个函数的一部分
sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
if (sqlca.sqlcode < 0) sqlErr();
}
strcat(sql_lastTime.arr, "\0");
strncpy(pchLastTime, sql_lastTime.arr, TIME_LEN);
return(TIME_LEN);
}
这个是程序报错的common.c文件中的getUpdateTime这个函数的一部分
sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
if (sqlca.sqlcode == 1403) break;/*注意这一行,这是比上面多出来的*/
if (sqlca.sqlcode < 0) sqlErr();
}
strcat(sql_lastTime.arr, "\0");
strncpy(pchLastTime, sql_lastTime.arr, TIME_LEN);
return(TIME_LEN);
}
大家看见多出来的一行的内容了吧?多出了一个break,但是这里没有循环,所以这个break存在非法,它找不到去break到哪里了,所以出错。
但是我绝对发誓的一点就是仅仅只是复制到下一行,其实复制到下下行下下下下行结果都是一样,都是报错,只有不修改程序不移动这个函数
的位置就不会出错。请大家帮帮忙吧。。。。。。。。。。。。。。。。。。。。。