异想天开

What's the true meaning of light, Could you tell me why

errno相关

日期:2017-02-25 20:20:05
  
最后更新日期:2017-02-25 20:21:15
这个问题有趣,记录一下。 在mysql的异常类中有如下定义:
[code lang="cpp"]
class CMysqlException:public exception
{
public:
explicit CMysqlException(string sErrorMsg, string sSql,int errno): exception()
{
m_str = sErrorMsg;
m_sSql = sSql;
m_errno = errno;
}
//其余省略
}
[/code]
编译的时候有如下警报: warning: invalid conversion from ‘unsigned int’ to ‘int* (*)()’ [-fpermissive]
note: initializing argument 3 of ‘MYFRAMECOMMON::CMysqlException::CMysqlException(std::__cxx11::string, std::__cxx11::string, int* (*)())’
当时因为编译参数加了-fpermissive,所以前面那个转化编译器放过了。但只有出现mysql异常时,抛出异常对象时, 就会core掉。 纳闷怎么把函数定义给偷换掉了。 后面无意将变量名errno改为err这个问题就消失了。点开头文件一看errno的底层实现 /usr/include/x86_64-linux-gnu/bits/errno.h
[code lang="cpp"]
# ifndef __ASSEMBLER__
/* Function to get address of global `errno' variable. */
extern int *__errno_location (void) __THROW __attribute__ ((__const__));

# if !defined _LIBC || defined _LIBC_REENTRANT
/* When using threads, errno is a per-thread value. */
# define errno (*__errno_location ())
# endif
# endif /* !__ASSEMBLER__ */
[/code]
这个errno是用宏定义的,正好将前面的函数原型给替换掉了。同时编译又加了-fpermissive,编译也过了。所以直到有异常时才会出这种奇葩问题。吓得赶紧把-fpermissive取消掉了。