__attribute__((always_inline)) 失败

4

我想知道是否有人能够解决这个问题。我得到了一个带有几个always_inline方法的头文件,它被包含在多个地方。自从我升级了操作系统(Debian Wheezy)并使用了更新版本的gcc 4.7.1之后,我遇到了许多失败的内联警告。我能够在gcc 4.4.5(Debian Squeezy)上成功编译。我正在使用的编译命令是:

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

代码:

#ifndef __MCIDSHEADER_H__
#define __MCIDSHEADER_H__

#include <stdlib.h>

/* C functions */
#ifdef __cplusplus
extern "C" {
#endif

    /* Constructor and destructor */
    mcidsheader* mcidsheader_new(mcidsheader* obj, sqlite3* ids, crSettings* settings);
    void mcidsheader_delete(mcidsheader* obj);

/* set schedule number */
__attribute__ ((always_inline)) static int mcidsheader_set_schedno(mcidsheader* obj, unsigned int var)
{
    MC_CHK_OBJ(obj);
    obj->var_sched_no = var;
    /* memset schedule number */
    memset(obj->var_sched, 0, MCIDSHEADER_SCHEDNUM_SZ);
    /* copy to local */
    sprintf(obj->var_sched, "%i", var);
    obj->var_flg = 0;
    return 0;
}

/* Get schedule number */
__attribute__ ((always_inline)) static const char* mcidsheader_get_schedno(const mcidsheader* obj)
{
    MC_CHK_OBJ_PTR(obj);
    return obj->var_sched;
}

/* set job number */
__attribute__ ((always_inline)) static int mcidsheader_set_jobnumber(mcidsheader* obj, const char* var)
{
    MC_CHK_OBJ(obj);

    /* memset buff */
    memset(obj->var_jobnumber, 0, MCIDSHEADER_JOBNUMBER_SZ);
    MC_CHK_OBJ(var);
    /* copy to local */
    strcpy(obj->var_jobnumber, var);
    obj->var_flg = 0;
    return 0;
}

/* get job number */
__attribute__ ((always_inline)) static const char* mcidsheader_get_jobnumber(const mcidsheader* obj)
{
    MC_CHK_OBJ_PTR(obj);
    return obj->var_jobnumber;
}

/* set project */
__attribute__ ((always_inline)) static int mcidsheader_set_project(mcidsheader* obj, const char* var)
{
    MC_CHK_OBJ(obj);

    /* memset buff */
    memset(obj->var_project, 0, MCIDSHEADER_PROJECT_SZ);
    MC_CHK_OBJ(var);

    /* copy to local */
    strcpy(obj->var_project, var);
    obj->var_flg = 0;
    return 0;
}

/* Get project name */
__attribute__ ((always_inline)) static const char* mcidsheader_get_project(const mcidsheader* obj)
{
    MC_CHK_OBJ_PTR(obj);
    return obj->var_project;
}

/* Set client */
__attribute__ ((always_inline)) static int  mcidsheader_set_client(mcidsheader* obj, const char* var)
{
    MC_CHK_OBJ(obj);

    /* memset buff */
    memset(obj->var_client, 0, MCIDSHEADER_CLIENT_SZ);
    MC_CHK_OBJ(var);

    /* copy to local */
    strcpy(obj->var_client, var);
    obj->var_flg = 0;
    return 0;
}

/* get client */
__attribute__ ((always_inline)) static const char* mcidsheader_get_client(const mcidsheader* obj)
{
    MC_CHK_OBJ(obj);
    return obj->var_client;
}

/* set date */
__attribute__ ((always_inline)) static int mcidsheader_set_date(mcidsheader* obj, const char* var)
{
    MC_CHK_OBJ(obj);
    /* memset buff */
    memset(obj->var_date, 0, MCIDSHEADER_DATE_SZ);
    MC_CHK_OBJ(var);
    /* copy to local */
    strcpy(obj->var_date, var);
    obj->var_flg = 0;
    return 0;
}

/* get date */
__attribute__ ((always_inline)) static const char* mcidsheader_get_date(const mcidsheader* obj)
{
    MC_CHK_OBJ_PTR(obj);
    return obj->var_date;
}

/* Get struct size */
__attribute__ ((always_inline)) static unsigned int mcidsheader_get_size(const mcidsheader* obj)
{
    if(!obj) return 0;
    return obj->var_size;
}

#ifdef __cplusplus
}
#endif

#endif /* __MCIDSHEADER_H__ */

警告具体是说什么?听起来可能是由于某种原因无法内联这些函数。 - Goz
2
@Goz,这是GCC在使用always_inline属性时经常抛出的错误...为了解决这个问题,在属性前添加“inline”即可。 - user1551592
@anojmperera 我会添加一个答案,请接受它。这样更容易找到。 - user1551592
1个回答

10

来自GCC手册

GCC does not inline any functions when not optimizing unless you specify the always_inline attribute for the function, like this:

/* Prototype.  */
inline void foo (const char) __attribute__((always_inline));
所以,为了解决这个问题,你需要在属性前添加一个inline

7
@DietrichEpp为什么还要发表这样无用的评论呢? - user1551592
1
在Stack Overflow上,答案应该是相对完整的。请参阅如何回答。理想情况下,从Google进入此页面的人应该能够通过阅读答案来理解解决方案,而不必寻找评论或跟随链接。 - Dietrich Epp
1
我的早先评论有点粗鲁,对此感到抱歉。 - Dietrich Epp
2
添加 inline 并不能解决它。你还需要添加 static,而 OP 已经在他的代码中添加了。 - Brian Vandenberg
1
嗯,OP很懒,这很糟糕。然而,你引用的always_inline文档实际上是错误的。我最近将其更改为:
通常情况下,除非指定了优化,否则不会内联函数。对于声明为inline的函数,此属性会使函数内联,而不受其他内联限制的影响。未能内联此类函数将被诊断为错误。请注意,如果间接调用此类函数,则编译器可能会或可能不会内联它,具体取决于优化级别,未能内联间接调用可能会或可能不会被诊断。
- Daniel Santos
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接