静态内联空隙和空白之间有什么区别?

TZP*_*e05 16 c static inline void

我正在使用C语言并修改以前由其他人编写的代码.我正在努力解决一些问题,而且我正在努力尽可能多地了解正在发生的事情.所以,正如我的问题所说,创建函数static inline voidvoid创建函数之间有什么区别?我为这篇长篇文章提前道歉,但我想让你知道我做了一些研究,但不明白我发现了什么.

我找到了一个static令我困惑的解释:

静态说明符表示无法从其他文件引用该函数; 也就是说,链接器不会导出名称.

通过阅读本文,我假设引用一个函数与调用函数不同?我假设因为这个函数是从另一个.c文件调用的.如果是这种情况,那么什么是引用函数?

通过同一个网站,他们解释内联功能,我不明白它的含义.

__inline关键字告诉编译器将函数定义中的代码替换为函数调用的每个实例.但是,替换仅在编译器自行决定时发生.例如,如果函数的地址被采用或者它太大而不能内联,则编译器不会内联函数.

咦???

非常感谢任何帮助,我再次为这篇非常长的帖子道歉.

以下位于file1.c(使用通用名称,因为我觉得不重要)

COMPLEX cNoiseSample;
CGauss( &cNoiseSample, loopbackRadio->pState );
Run Code Online (Sandbox Code Playgroud)

以下文件位于file2.c中

static inline void CGauss( COMPLEX * pcGauss, P_OS_UNIFORM_RAND_STATE pState )
{
    //code
}
Run Code Online (Sandbox Code Playgroud)

Gra*_*and 13

static意味着它不能从另一个编译单元(源文件)引用."引用"表示通过名称调用或以其他方式引用,例如分配给函数指针.

inline是一个提示编译器,函数的代码应该在它被调用的位置内联生成,而不是作为一个单独的函数生成分支.这通常是出于性能原因而完成的.处理微软的报价:

如果函数的地址被采用或者它太大而不能内联,则编译器不会内联函数.

内联函数没有地址,因为它不作为单独的实体存在.它的代码与它所调用的代码无缝地交织在一起.因此,如果您获取函数的地址(例如,指定给指针),则编译器必须将其生成为实函数,并且不能内联它.

void 表示该函数不返回值.


看了你的代码示例,我猜想有一个单独的定义,CGauss()file1.c调用,而file2.c调用自己的私有版本.如果不是这样,或者在file1.c#include荷兰国际集团file2.c中.这会很讨厌.


tsk*_*zzy 6

static只有当你有多个源文件时才意味着什么.它指定static无法从不同文件中的函数访问函数或变量.

inline是一种编译器优化,可以在某些情况下加速您的代码.无论何时调用函数,都会产生一些与之相关的开销.所以编译器可以做的是通过复制+粘贴(几乎)内联代码来全部消除这个功能.

这是一个内联的例子:

int dotproduct(int x1, int y1, int x2, int y2) {
    return multiply(x1,x2)+multiply(y1,y2);
}

inline int multiply(int a, int b) {
    return a*b;
}
Run Code Online (Sandbox Code Playgroud)

编译器会把它变成:

int dotproduct(int x1, int y1, int x2, int y2) {
    return x1*x2+y1*y2;
}
Run Code Online (Sandbox Code Playgroud)

如果你想要花哨,你也可以内联dotproduct函数;)

请注意,inline关键字只是推动编译器内联某些函数.根据自己的判断,它可能会也可能不会实际执行.