记一次static 入门

刚开始用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代码要特别注意,不能被覆盖,也不能覆盖了别人。

发布了16 篇原创文章 · 获赞 10 · 访问量 15万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览