Tag: 内联函数

内联vararg函数

在玩优化设置时,我注意到一个有趣的现象:采用可变数量参数( … )的函数似乎从未被内联。 (显然这种行为是特定于编译器的,但我已经在几个不同的系统上进行了测试。) 例如,编译以下小程序: #include #include 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; } 似乎总会导致出现在可执行的可执行文件中的(可能是损坏的) test符号(在MacOS和Linux上以C和C ++模式使用Clang和GCC进行测试)。 如果修改了test()的签名以获取传递给printf()的普通字符串,那么两个编译器都会从-O1向上内联函数,如您所期望的那样。 我怀疑这与用于实现varargs的伏都教魔法有关,但通常这样做对我来说是个谜。 任何人都可以告诉我编译器通常如何实现vararg函数,以及为什么这似乎阻止了内联?

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

我在一个非常大的应用程序中发现了这个问题,从中做了一个SSCCE。 我不知道代码是否有未定义的行为或-O2打破它。 用gcc ac -o a.exe -O2 -Wall -Wextra -Werror编译它时会输出5 。 但是在没有-O2 (例如-O1 )的情况下编译时会打印25 ,或者在2个注释行中取消注释(防止内联)。 #include #include // __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) { […]

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

我想在项目中定义一个内联函数,用c99编译。 我该怎么做? 当我在头文件中声明该函数并在.c文件中提供详细信息时,其他文件无法识别该定义。 当我将显式函数放在头文件中时,我遇到了问题,因为使用它的所有.o文件都有定义的副本,因此链接器给出了“多重定义”错误。 我想要做的是: header.h inline void func() { do things… } lib1.c #include “header.h” … lib2.c #include “header.h” 使用lib1.o和lib2.o的实用程序

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

我有一个C ++程序,我用mingw编译(gcc for Windows)。 使用包含gcc 4.4.1的mingw的TDM版本。 可执行文件链接到两个静态库(.a)文件:它们是用C语言编写的第三方库; 另一个是由我编写的C ++库,它使用C库提供我自己的C ++ API。 在我看来,过多的C库function部分是在内联函数中实现的。 当你使用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的多个定义 这个只是想知道为什么违反一个定义规则不是错误: 具有不同定义的内联函数的不可预测的行为