刚开始用C操作MYSQL,完事具备,代码也核对了很多遍,就是报错,
gcc 编译通过,但是执行时 提示 Can't create UNIX socket
用Clion 写好了CMakeLists ,编译通过但是执行总是报错
Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
lib include 检查了很多次,没有任何问题。
======================
#include <stdio.h>
#include "mysql.h"
struct mysql_config{
char * host;
unsigned int port;
char * username;
char * passwd;
char * dbname;
int timeout;
};
int connect(struct mysql_config config);
int main(void)
{
struct mysql_config config = {"localhost",3306,"test","test","test",5};
connect(config);
return 0;
}
int connect(struct mysql_config config){
MYSQL *mysql_connect_handle;
int options;
mysql_connect_handle = mysql_init(NULL);
// options = mysql_options(&mysql_connect_handle,MYSQL_OPT_CONNECT_TIMEOUT,(const int *)&config.timeout);
char *server = "localhost";
char *user = "test";
char *password = "test";
char *database = "test";
if (!mysql_real_connect(mysql_connect_handle, server,user, password, database, 3306, NULL, 0))
{
fprintf(stderr, "%s\n", mysql_error(mysql_connect_handle));
exit(1);
}
}
==============
各位,很可能已经发现了, 自定义的方法 connect() 和mysql中的connect 方法重名了,导致一直找不到真正的原因,这里刚入门汗颜一下,然后回想起了 static 关键字.
详细说明:
static函数与普通函数的区别:
用static修饰的函数,本限定在本源码文件中,不能被本源码文件以外的代码文件调用。而普通的函数,默认是extern的,也就是说,可以被其它代码文件调用该函数。
在函数的返回类型前加上关键字static,函数就被定义成为静态函数。普通 函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。因此定义静态函数有以下好处:
<1> 其他文件中可以定义相同名字的函数,不会发生冲突。
<2> 静态函数不能被其他文件所用。
================
所以,修改后代码:
#include <stdio.h> #include "mysql.h" #include <stdlib.h> struct mysql_config{ char * host; unsigned int port; char * username; char * passwd; char * dbname; int timeout; }; static int connect(struct mysql_config config); int main(void) { struct mysql_config config = {"localhost",3306,"test","test","test",5}; connect(config); return 0; } static int connect(struct mysql_config config){ MYSQL *mysql_connect_handle; int options; mysql_connect_handle = mysql_init(NULL); // options = mysql_options(&mysql_connect_handle,MYSQL_OPT_CONNECT_TIMEOUT,(const int *)&config.timeout); char *server = "localhost"; char *user = "test"; char *password = "test"; char *database = "test"; if (!mysql_real_connect(mysql_connect_handle, server,user, password, database, 3306, NULL, 0)) { fprintf(stderr, "%s\n", mysql_error(mysql_connect_handle)); exit(1); } }
OK,现在就不会有问题了,写习惯了脚本语言,特别是OOP之后,再回到面向过程编程,难免忽略函数覆盖的问题,通过static可以很好的避免这种问题,看来以后写C代码要特别注意,不能被覆盖,也不能覆盖了别人。