在下列情况下,我无法摆脱编译器警告“赋值从整数中生成指针”:
int sql_user(char** mysql_user_name, char** mysql_password, char** mysql_server, char **mysql_serverport, char** mysql_socket)
{
int retval = -1;
char **sub;
char *contents;
if(g_file_get_contents("mysqlsrv.def", &contents, NULL, NULL))
{
sub = g_strsplit(contents, "\n", -1);
//here compiler warning: assignment makes pointer from integer without a cast
*mysql_user_name = sub[0];
*mysql_password = sub[1];
*mysql_server = sub[2];
*mysql_serverport = sub[3];
*mysql_socket = sub[4];
if (!strlen(sub[4])) *mysql_socket = NULL;
retval = 0;
}
return retval;
}
另外,在sub [4]中是空字符串(“”)。这里有一种方法可以将NULL保存到文本文件中,以便以后可以将其作为NULL而不使用If(!strlen ... condition?
任何帮助都将不胜感激。
答案 0 :(得分:5)
听起来像g_strsplit()是未知的(声明的),因此编译器假设默认返回类型为int。 我会检查你的包含文件,以确保包含声明g_strsplit()的文件。
答案 1 :(得分:2)
不,没有将NULL保存到文本文件的通用方法,您需要决定在配置文件中对它进行编码的方式。
在这种特殊情况下,最简单的方法就是建议if(!strlen(sub[4]))
。
如果您想拥有支持NULL的配置文件格式,我建议使用标记语言或编码格式,例如YAML,JSON,INI或{{3}这样你可以使用现有的库,避免重新发明轮子。
由于你已经是Gnome lib,Protocol Buffers将是一个不错的选择。
答案 2 :(得分:1)
g_strsplit
函数未在源文件中声明,并且函数的隐式声明由编译器生成。隐含的声明是这样的:
/* function that takes an unspecified number of parameters and retuns an int */
extern int g_strsplit();
要解决此问题,请添加g_strsplit
功能的相关标头:
#include <glib.h>
#include <glib/gprintf.h>