C __属性_uuu((始终_内联))失败

C __属性_uuu((始终_内联))失败,c,gcc,C,Gcc,我想知道是否有人能解释一下这件事。我得到了一个头文件,其中包含了一些总是内联的方法,其中包括了几个地方。自从我用更新版本的GCC4.7.1升级了操作系统(Debian Wheezy),我收到了大量关于失败内联线的警告。我能够在GCC4.4.5(Debian Squeezy)上成功地编译这篇文章。我使用的编译命令是 gcc -g -Wall -O0 -o [prog_name] [sources].c -l[link libraries] 代码: \ifndef\uu mcidssheader\

我想知道是否有人能解释一下这件事。我得到了一个头文件,其中包含了一些
总是内联的
方法,其中包括了几个地方。自从我用更新版本的GCC4.7.1升级了操作系统(Debian Wheezy),我收到了大量关于失败内联线的警告。我能够在GCC4.4.5(Debian Squeezy)上成功地编译这篇文章。我使用的编译命令是

gcc -g -Wall -O0 -o [prog_name] [sources].c -l[link libraries]
代码:

\ifndef\uu mcidssheader\uh__
#定义__
#包括
/*C函数*/
#ifdef_uucplusplus
外部“C”{
#恩迪夫
/*构造函数和析构函数*/
MCIDSSHEADER*MCIDSSHEADER\新建(MCIDSSHEADER*obj、sqlite3*ids、crSettings*设置);
作废MCIDSSHEADER_删除(MCIDSSHEADER*obj);
/*设置计划编号*/
__属性uu((始终_内联))静态整数mcidsheader\u set\u schedno(mcidsheader*obj,无符号整数变量)
{
MC_CHK_OBJ(OBJ);
obj->var\u sched\u no=var;
/*memset计划编号*/
memset(obj->var_sched,0,mcidssheader_SCHEDNUM_SZ);
/*抄送本地*/
sprintf(obj->var_sched,“%i”,var);
obj->var_flg=0;
返回0;
}
/*获取计划编号*/
__属性(始终为内联)静态常量char*mcidsheader\u get\u schedno(常量mcidsheader*obj)
{
MC_CHK_OBJ_PTR(OBJ);
返回obj->var_sched;
}
/*设置作业编号*/
__属性uu((始终_内联))静态整数mcidsheader\u set\u作业编号(mcidsheader*obj,const char*var)
{
MC_CHK_OBJ(OBJ);
/*memset buff*/
memset(obj->var_jobnumber,0,MCIDSHEADER_jobnumber_SZ);
MC_CHK_OBJ(var);
/*抄送本地*/
strcpy(obj->var\U工作编号,var);
obj->var_flg=0;
返回0;
}
/*获取工作编号*/
__属性(始终为内联)静态常量char*mcidsheader\u get\u作业编号(常量mcidsheader*obj)
{
MC_CHK_OBJ_PTR(OBJ);
返回obj->var_作业编号;
}
/*集合项目*/
__属性(始终为内联)静态int-mcidsheader\u-set\u项目(mcidsheader*obj,const-char*var)
{
MC_CHK_OBJ(OBJ);
/*memset buff*/
memset(obj->var_项目,0,MCIDSHEADER_项目_SZ);
MC_CHK_OBJ(var);
/*抄送本地*/
strcpy(obj->var\U项目,var);
obj->var_flg=0;
返回0;
}
/*获取项目名称*/
__属性(始终为内联)静态常量字符*mcidsheader\U get\U项目(常量mcidsheader*obj)
{
MC_CHK_OBJ_PTR(OBJ);
返回obj->var_项目;
}
/*设置客户端*/
__属性uu((始终_内联))静态整数mcidsheader\u set\u客户端(mcidsheader*obj,const char*var)
{
MC_CHK_OBJ(OBJ);
/*memset buff*/
memset(obj->var_client,0,mcidssheader_client_SZ);
MC_CHK_OBJ(var);
/*抄送本地*/
strcpy(obj->var\u客户,var);
obj->var_flg=0;
返回0;
}
/*获取客户*/
__属性uuu((始终_内联))静态常量char*mcidsheader\u get\u客户端(常量mcidsheader*obj)
{
MC_CHK_OBJ(OBJ);
返回obj->var_客户端;
}
/*设定日期*/
__属性(始终为内联)静态整数mcidsheader\u set\u日期(mcidsheader*obj,const char*var)
{
MC_CHK_OBJ(OBJ);
/*memset buff*/
memset(obj->var_date,0,mcidssheader_date_SZ);
MC_CHK_OBJ(var);
/*抄送本地*/
strcpy(obj->var\U日期,var);
obj->var_flg=0;
返回0;
}
/*约会*/
__属性(始终为内联)静态常量字符*mcidsheader\U获取日期(常量mcidsheader*obj)
{
MC_CHK_OBJ_PTR(OBJ);
返回obj->var_日期;
}
/*获取结构大小*/
__属性(始终为内联)静态无符号整数mcidsheader\u get\u size(常量mcidsheader*obj)
{
如果(!obj)返回0;
返回对象->变量大小;
}
#ifdef_uucplusplus
}
#恩迪夫
#endif/*\uuu MCIDSHEADER\u H\uu*/
来自:

除非您为函数指定
always\u inline
属性,否则GCC在未优化时不会内联任何函数,如下所示:

/* Prototype.  */
inline void foo (const char) __attribute__((always_inline));

因此,要解决这个问题,您必须在属性前面添加一个
内联

警告到底说了什么?听起来可能是因为某种原因,它无法内联这些函数。@Goz这就是GCC在执行always_inline属性时总是抛出的内容。。。若要解决此问题,请在属性之前添加一个
内联
。@user9000谢谢。“行了。”阿诺伊姆佩雷拉我会补充一个答案,请接受。所以它会更容易找到。@DietrichEpp为什么还要费心发布这样无用的评论呢?关于堆栈溢出,答案应该相对完整。看见理想情况下,从Google访问此页面的人应该能够通过阅读答案理解解决方案,而不必搜索评论或跟踪链接。我之前的评论有点粗鲁,对此表示抱歉。添加
内联
并不能解决此问题。您还必须添加
static
,OP的代码中已经包含了它。好吧,OP是懒惰的,这很糟糕。然而,您引用的始终在线文档实际上是错误的。我最近将此更改为:>通常,除非指定了优化,否则函数不会内联。对于声明为内联的函数,此属性内联函数,而不受其他应用于内联的任何限制。未能内联此类函数被诊断为错误。请注意,如果间接调用此类函数,编译器可能会或可能不会内联它,这取决于优化级别,并且可能会或可能不会诊断内联间接调用失败。
/* Prototype.  */
inline void foo (const char) __attribute__((always_inline));