记一次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代码要特别注意,不能被覆盖,也不能覆盖了别人。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值