标签: inline-functions

如何在C99多文件项目中声明内联函数?

我想在项目中定义一个内联函数,用c99编译.我该怎么做?当我在头文件中声明该函数并在.c文件中提供详细信息时,其他文件无法识别该定义.当我将显式函数放在头文件中时,我遇到了一个问题,因为使用它的所有.o文件都有定义的副本,因此链接器给我一个"多重定义"错误.

我想要做的是:

header.h
inline void func()
{
    do things...
}


lib1.c
#include "header.h"
...

lib2.c
#include "header.h"
Run Code Online (Sandbox Code Playgroud)

使用lib1.o和lib2.o的实用程序

c linker c99 inline-functions

25
推荐指数
2
解决办法
1万
查看次数

静态内联,外部内联和普通内联函数之间有什么区别?

什么是之间的区别static inline,extern inline和正常的inline功能?

我已经看到了一些模糊的解释.据我所知,static inline不仅仅是一个inline仅在某个文件中引用的函数,因为static关键字通常意味着.这同样适用于extern inline过我想,这是不一样的解释与extern变量.任何答案将不胜感激!

c static extern inline-functions

25
推荐指数
1
解决办法
8011
查看次数

24
推荐指数
3
解决办法
2万
查看次数

C++中的内联函数

如果我们在类定义本身中定义一个成员函数,它是否必须内联处理,或者它只是对编译器的一个请求,它可以忽略.

c++ inline-functions

18
推荐指数
2
解决办法
976
查看次数

内联vararg函数

在玩优化设置时,我注意到一个有趣的现象:采用可变数量的参数(...)的函数似乎永远不会被内联.(显然这种行为是特定于编译器的,但我已经在几个不同的系统上进行了测试.)

例如,编译以下小程序:

#include <stdarg.h>
#include <stdio.h>

static inline void test(const char *format, ...)
{
  va_list ap;
  va_start(ap, format);
  vprintf(format, ap);
  va_end(ap);
}

int main()
{
  test("Hello %s\n", "world");
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

似乎总是会test在生成的可执行文件中出现(可能是损坏的)符号(在MacOS和Linux上以C和C++模式使用Clang和GCC进行测试).如果修改了签名test()以获取传递给的普通字符串printf(),那么-O1两个编译器都会按照您的预期向上内联函数.

我怀疑这与用于实现varargs的巫术魔法有关,但是通常这样做对我来说是个谜.任何人都可以告诉我编译器通常如何实现vararg函数,以及为什么这似乎阻止了内联?

c c++ variadic-functions inline-functions

18
推荐指数
2
解决办法
2952
查看次数

是GCC的选择-O2打破这个小程序还是我有未定义的行为

我在一个非常大的应用程序中发现了这个问题,从中做了一个SSCCE.我不知道代码是否有未定义的行为或-O2打破它.

gcc a.c -o a.exe -O2 -Wall -Wextra -Werror它编译时打印5.

但是在编译时没有(例如)或取消注释2条注释行之一(防止内联)时打印25.-O2-O1

#include <stdio.h>
#include <stdlib.h>
// __attribute__((noinline)) 
int f(int* todos, int input) {
    int* cur = todos-1; // fixes the ++ at the beginning of the loop
    int result = input;
    while(1) {
        cur++;
        int ch = *cur;
        // printf("(%i)\n", ch);
        switch(ch) {
            case 0:;
                goto end;
            case 1:;
                result = result*result;
            break;
        }
    }
    end:
    return result;
}
int main() …
Run Code Online (Sandbox Code Playgroud)

c gcc inline-functions compiler-optimization

14
推荐指数
1
解决办法
610
查看次数

LLVM是否将Objective-C方法转换为内联函数?

  1. LLVM是否会在可能的情况下自动将Objective-C方法转换为内联函数?

    (即,为一块代码创建一个Objective-C方法,你可以在其他方式粘贴内联吗?)

  2. 如果LLVM不执行此优化,为什么不呢?如果是,(a)是否有必须为此设置的某些构建设置?(b)如何判断是否内联Objective-C方法?

performance objective-c llvm inline-functions

13
推荐指数
3
解决办法
2156
查看次数

链接静态库时内联函数的多个定义

我有一个C++程序,我用mingw编译(gcc for Windows).使用包含gcc 4.4.1的mingw的TDM版本.可执行文件链接到两个静态库(.a)文件:它们是用C编写的第三方库; 另一个是由我编写的C++库,它使用C库提供我自己的C++ API.

在我看来,(在我看来,过多)部分C库的功能是在内联函数中实现的.当你使用C库的API时,你无法避免包含内联函数,但当我尝试将它们全部链接在一起时,我会收到链接错误,说明所有内联函数都有多个定义 - 我都有在我的C++包装器库中调用,而我没有调用它,基本上在头文件中内联定义的任何内容都在C库和C++库中为它创建了一个函数.

当包含文件在同一项目中的不同.c或.cpp文件中多次使用时,它不会导致多个定义错误; 问题只是它为每个库生成一个定义.

编译器如何/为什么在两个库中为这些内联函数生成函数和符号?如何强制它停止在我的代码中生成它们?是否有一个工具可以运行以从.a文件中删除重复的函数,或者是一种使链接器忽略多个定义的方法?

(仅供参考,第三方库在其所有标题中都包含#ifdef __cplusplus和extern"C"保护;无论如何,如果这是问题,它不会导致符号的多重定义,它会导致相反的问题,因为符号会不确定或至少不同.)

值得注意的是,如果我链接到第三方C库的DLL,则不会发生链接错误; 然而,我得到奇怪的运行时故障似乎与我的代码有关,它应该从DLL调用自己的函数版本.(好像编译器正在创建我没有要求的本地版本的函数.)

之前已经问过这个问题的类似版本,但是,我没有找到任何这些问题的答案:

这个问题的答案是海报是多个定义变量,我的问题是内联函数的多重定义: 重复多重定义错误在多个cpps中包含相同的标题

这是一个MSVC计划,但我正在使用mingw; 另外,海报在这个问题中的问题是在标题中类主体之外定义C++类构造函数,而我的问题是内联的C函数: 静态Lib多重定义问题

这个傻瓜将他的所有C代码重命名为C++文件,他的C代码不是C++ - 安全:链接时 多个std :: functions的多个定义

这个只是想知道为什么违反一个定义规则不是错误: 具有不同定义的内联函数的不可预测的行为

c c++ linker-errors inline-functions tdm-mingw

12
推荐指数
1
解决办法
2万
查看次数

自动内联JavaScript函数调用的工具?

内联JavaScript函数调用可以加快执行速度,并在gzipping之后减少代码大小,如本文所述:

http://blog.calyptus.eu/seb/2011/01/javascript-call-performance-just-inline-it/

但是,我找不到一个自动处理JS源文件并在其中内联所有(或更好的,选定的)inlinable函数调用的工具.谷歌的Closure Compiler做了一些内联,但并不总是,也不是可配置的.

提前致谢!

javascript inline-functions

11
推荐指数
1
解决办法
2195
查看次数

是否有一个实际的例子,其中内联对C程序的性能有害?

在关于inline函数声明中的关键字的许多争论中,有人会指出它在某些情况下实际上会使程序变慢 - 主要是由于代码爆炸,如果我是正确的.我自己从未在实践中遇到过这样的例子.什么是实际代码,使用inline可能会对性能有害?

c optimization performance inline-functions

11
推荐指数
1
解决办法
259
查看次数