代码之家  ›  专栏  ›  技术社区  ›  Michał Trybus

gcc-2版本,内联函数的不同处理

  •  3
  • Michał Trybus  · 技术社区  · 14 年前

    主c:

    #include "header.h"
    #include <stdio.h>
    
    int main()
    {
        printf("f() %i\n", f());
        return 0;
    }
    

    文件.c:

    #include "header.h"
    int some_function()
    {
        return f();
    }
    

    页眉.h

    inline int f()
    {
        return 2;
    }
    

    gcc main.c file.c -std=c99 -O2
    

    我得到链接器错误(f的多个定义),如果我删除 -O2 main.c file.c f 静态,那么,在最坏的情况下,有几个 f

    但是我试着在gcc-4.3.5中编译这段代码:

    gcc main.c文件.c-std=c99-O2
    

    一切正常,所以我假设新的gcc是内联的 f

    然而,当我移除 -氧气 flag,我有两个未定义的引用 int f() 在这里,我真的不明白发生了什么。好像是在假设 f -氧气 )它决定生成对这些函数的调用,而不是内联,这就是链接器错误的来源。

    现在问题来了:我应该如何定义和声明简单和小的函数(我希望内联),以便它们可以在整个项目中使用,而不必担心在各种编译器中出现问题?让它们都静止是正确的做法吗?或者gcc-4坏了,我不应该在几个翻译单元中有多个内联函数的定义,除非它们是静态的?

    1 回复  |  直到 9 年前
        1
  •  5
  •   terminus    14 年前

    是的,行为已从gcc-4.3开始更改。gcc内联文档( http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Inline.html

    简而言之:纯内联只是告诉gcc(在旧版本中) 所有调用者都来自文件范围,因此gcc还保留了一个可链接的版本 属于 f() 关于:这就解释了上面的复制符号错误。

    GCC4.3将此行为更改为与c99兼容。

    为了回答你的具体问题:

    现在问题来了:我应该如何定义和声明简单和小的函数(我希望内联),以便它们可以在整个项目中使用,而不必担心在各种编译器中出现问题?让它们都静止是正确的做法吗?或者gcc-4坏了,我不应该在几个翻译单元中有多个内联函数的定义,除非它们是静态的?

    如果您想要跨gcc版本的可移植性,请使用静态内联。