Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我是否应该故意在C99中跨翻译单元内联函数_C_C99_Inline Functions - Fatal编程技术网

我是否应该故意在C99中跨翻译单元内联函数

我是否应该故意在C99中跨翻译单元内联函数,c,c99,inline-functions,C,C99,Inline Functions,在我的问题中,我最初问了这四个问题 在C99编译器中,当涉及到跨翻译单元的内联时,inline实现的行为是否已定义 如果是,是否应该避免 有没有其他被普遍接受的方法 如果我的inline函数没有处处内联,我至少会得到某种链接器错误吗 在我的OP之后,我发现第一个问题已经在以下线程中进行了详细讨论: 关于这个话题有更多的线索,但这两条似乎一针见血 因此,基于这两个讨论,我们可以看到问题1的答案是肯定的。编译器在处理inline说明符方面绝对有一定的自由度 我们还看到,要使其工作,必须在头中

在我的问题中,我最初问了这四个问题

  • 在C99编译器中,当涉及到跨翻译单元的内联时,
    inline
    实现的行为是否已定义
  • 如果是,是否应该避免
  • 有没有其他被普遍接受的方法
  • 如果我的
    inline
    函数没有处处内联,我至少会得到某种链接器错误吗
  • 在我的OP之后,我发现第一个问题已经在以下线程中进行了详细讨论:

    关于这个话题有更多的线索,但这两条似乎一针见血

    因此,基于这两个讨论,我们可以看到问题1的答案是肯定的。编译器在处理
    inline
    说明符方面绝对有一定的自由度

    我们还看到,要使其工作,必须在头中定义
    内联
    函数

    除此之外,还存在以下选项:

  • 标题中的函数定义可能有一个
    静态
    说明符
  • 如果头定义没有
    静态
    说明符,则可以通过某个公共头文件中的
    外部
    声明所有调用函数的C文件也将
    #包括
  • 如果不使用方法2和3,方法4将在每个希望调用它的C文件中通过
    extern
    声明这个
    inline
    函数
  • 因此,既然所有这些解释都被排除在外,我想把这个问题重新集中在我最初的项目#2和#3上——我应该这样做吗?如果是的话,最可接受的方式是什么

    我应该这样做吗?还是应该尽可能避免这样做? 以我的应用程序为例,我的驱动程序中有一个经常调用的单行函数(≈ 每秒几百次),但只能从3或4个其他地方。因此,使用
    inline
    不会导致代码膨胀——事实上,结果可以忽略不计。Gregory Pakosz概述了何时使用
    内联
    函数以及何时不使用内联函数。因此,如果这是在一个翻译单元中使用的一个函数,答案将非常清楚。但这不是我要问的

    在这种情况下,我不需要内联这个函数。但我应该吗?我可能永远不会注意到任何性能差异,因为我只内联了这一个函数。但我想弄清楚,在所有类似的情况下,我是否应该把这作为我的常规做法。如果我内联经常被更积极地调用的短函数,我可能会看到性能的提高。(我的运行时环境是一个低功耗16位RISC MCU——这可能是一个重要的细节。)

    提出这个问题的原因是,程序员之间似乎对此存在分歧。出于某种原因,跨翻译单元内联函数(无论您如何操作)是不是很不礼貌?如果是,为什么

    假设我跨翻译单元执行内联函数,那么最不讨厌或最可接受的方式是什么? 将
    static
    放在标题中似乎效果不错,可能是最方便的方法。评论和答复中指出了这一点。表面上看,我似乎在使用
    static
    来促进全局使用某些东西,这简直是胡说八道!但是我想我可以更正确地这样思考:内联这个函数的每个函数都有自己的静态副本,就好像它在各自的C文件中被定义为
    static inline
    。如果这种理解是正确的,那么行为似乎总是可以预测的——如果翻译单元中有两个同名函数,链接器必须通知我


    我不确定我对通过头中的
    extern
    声明函数的感觉如何。6.7.4中的措辞是,另一个翻译单元中的外部定义是“不禁止的”。

    我认为您的驱动程序.h应该是这样的:

    static inline void foo(void)
    {
        <one line>;
    }
    
    静态内联void foo(void)
    {
    ;
    }
    
    而且您的bar.c不需要
    extern-inline-void-foo(void)
    ,只需调用
    foo(),它会工作的

    至于
    如果我的内联函数没有像它应该的那样到处内联,我至少会得到某种链接器错误警告我找不到某个引用


    编译时必须显式地使用优化选项,这样内联函数才能真正内联<代码>gcc条.c-O2
    。您可以使用
    objdump
    检查代码的汇编代码,您会发现内联函数内联,而不是调用
    foo
    ,而是内联

    那你在说什么?请出示一些代码。若你们想要内联函数,你们需要在头文件中放很多代码。(除非您使用的是链接时间优化,您不需要显式地
    inline
    )是的,我说的是将函数体放在头中。但不是关键字EXTERN。extern声明将发生在需要远程访问此内联函数的每个C文件中。请输入代码和示例。我仍然不理解你的问题。这与。在
    .h
    文件中的
    静态内联void foo(void){}
    有什么问题,其他地方没有更多的声明?这个方法有效-但extern也有效。那么,哪种方法更正确、更便于携带呢?我编辑了我的问题,首先将重点放在“我是否应该跨翻译单元内联函数”上。我认为两者都是正确的,就我所知没有区别,选择简单的一个。我有点困惑,我应该跨翻译单元内联函数吗?1跨翻译单元内联函数是什么意思?你是说穿过普拉特