TZP*_*e05 16 c static inline void
我正在使用C语言并修改以前由其他人编写的代码.我正在努力解决一些问题,而且我正在努力尽可能多地了解正在发生的事情.所以,正如我的问题所说,创建函数static inline void和void创建函数之间有什么区别?我为这篇长篇文章提前道歉,但我想让你知道我做了一些研究,但不明白我发现了什么.
静态说明符表示无法从其他文件引用该函数; 也就是说,链接器不会导出名称.
通过阅读本文,我假设引用一个函数与调用函数不同?我假设因为这个函数是从另一个.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中.这会很讨厌.
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关键字只是推动编译器内联某些函数.根据自己的判断,它可能会也可能不会实际执行.
| 归档时间: |
|
| 查看次数: |
27050 次 |
| 最近记录: |