【问题标题】:__attribute__((always_inline)) failing__attribute__((always_inline)) 失败
【发布时间】:2016-05-15 06:09:02
【问题描述】:

我想知道是否有人可以对此有所了解。我得到了一个带有几个 always_inline 方法的头文件,其中包含几个地方。由于我使用更新版本的 gcc 4.7.1 升级了操作系统(Debian Wheezy),因此我收到了大量关于内联失败的警告。我能够在 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 这就是 GCC 在执行 always_inline 属性时总是抛出的问题......并且要解决此问题,请在属性前添加 inline
  • @user9000 谢谢。这行得通。
  • @anojmperera 我会添加一个答案,请接受。所以会更容易找到。

标签: c gcc


【解决方案1】:

来自GCC manual

GCC 在不优化时不会内联任何函数,除非您为函数指定 always_inline 属性,如下所示:

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

因此,要解决此问题,您必须在属性前添加inline

【讨论】:

  • @DietrichEpp 为什么还要费心发表这种无用的评论?
  • 在 Stack Overflow 上,答案应该是比较完整的。见How To Answer。理想情况下,从 Google 访问此页面的人应该能够通过阅读答案来理解解决方案,而无需寻找 cmets 或点击链接。
  • 我之前的评论有点粗鲁,抱歉。
  • 添加 inline 并不能解决问题。您还必须添加static,OP 已经在他的代码中添加了它。
  • 好吧,OP 很懒,这很糟糕。但是 user9000,您引用的 always_inline 文档实际上是错误。我最近将其更改为: >通常,除非指定优化,否则函数不会内联。对于声明为内联的函数,此属性内联函数独立于其他适用于内联的任何限制。未能内联此类功能被诊断为错误。请注意,如果间接调用此类函数,编译器可能会或可能不会内联它,具体取决于优化级别,并且可能会或可能不会诊断出内联间接调用失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-11
  • 2021-03-21
相关资源
最近更新 更多