【问题标题】:funny Code behaviour有趣的代码行为
【发布时间】:2017-05-17 15:49:42
【问题描述】:

我正在尝试使用main() 函数中的以下代码连接到 mysql 数据库。

MYSQL *connect = mysql_init(NULL);

效果很好,我得到了一个返回的指针值。

我创建了另一个 c++ 文件,其中包含如下函数

int Newl_connection(FileHandler& pProcLog)
{
    MYSQL *connect = mysql_init(NULL);
    return 0;
}

编译和链接很好,我在主函数(作为测试)中对同一行代码进行了多次调用,一切正常,但是当我运行代码时,它在 Newl_connection() 函数中的行失败。

我已将 Newl_connection 剥离为尽可能基本的内容,并将包含 Main() 的文件中的所有标头包含到包含 Newl_connection() 函数的文件中。

我收到的编译器错误是

程序收到信号 SIGABRT,已中止。 0x00007ffff6bc6428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54 54 ../sysdeps/unix/sysv/linux/raise.c:没有这样的文件或目录。

尝试使用类型名称作为表达式。

尝试使用类型名称作为表达式

尝试使用类型名称作为表达式。出现在所有实例调用中,但 Newl_connection() 函数中的调用是终端。

我已尝试删除 main() 中的所有其他实例,但仍然遇到同样的问题。

为什么代码应该在一个地方工作,但在另一个地方表现不同? 帮助将不胜感激,我对此一无所知。

【问题讨论】:

  • 我猜这个问题是由于包含不正确的标题?但是如果没有一个最小的、完整的例子就很难说。
  • 调用函数时,是否传递了一个有效的FileHandler对象?
  • “为什么代码应该在一个地方工作,但在另一个地方表现不同?” 很多很多的原因。出示您的minimal reproducible example

标签: c++ mysql linux


【解决方案1】:

根据你的函数头:

int Newl_connection(FileHandler& pProcLog)

您应该使用FileHandler 类型的有效对象调用它。 将变量名称设置为pProcLog 让我觉得您想将其用作指向对象的指针。那么声明应该是:

int Newl_connection(FileHandler* pProcLog)

这样您就可以使用 null 值作为参数安全地调用函数。

【讨论】:

  • C++ 会允许你编译这种不匹配的程序吗?
  • 语法正确。使用 & 对对象进行 引用en.wikipedia.org/wiki/Reference_(C%2B%2B) 它与 pointer 非常相似,但调用它却不同。
  • 我知道什么是参考。但是如果函数被声明为获取引用,并且您尝试使用指针调用它,编译器应该将其报告为错误。
  • @Barmar:我同意,编译器会失败。
  • 大家好,谢谢,但问题不在于函数调用,而是函数中的行:- MYSQL *connect = mysql_init(NULL);在 main() 函数中可以正常工作,但在 newl_Connection() 函数中不行。我通过引用(pProcLog)传入一个类,这部分在更广泛的应用程序中工作正常。
猜你喜欢
  • 1970-01-01
  • 2017-04-26
  • 2017-02-07
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多