相关疑难解决方法(0)

没有"静态"或"外部"的"内联"在C99中是否有用?

当我尝试构建此代码时

inline void f() {}

int main()
{
    f();
}
Run Code Online (Sandbox Code Playgroud)

使用命令行

gcc -std=c99 -o a a.c
Run Code Online (Sandbox Code Playgroud)

我收到链接器错误(未定义引用f).如果我使用static inlineextern inline代替just inline,或者如果我使用-O(因此函数实际内联),则错误消失.

这种行为似乎在C99标准第6.7.4(6)段中定义:

如果转换单元中函数的所有文件范围声明都包含inline函数说明符extern,则该转换单元中的定义是内联定义.内联定义不提供函数的外部定义,也不禁止另一个转换单元中的外部定义.内联定义提供了外部定义的替代,翻译器可以使用该定义在同一翻译单元中实现对该功能的任何调用.未指定对函数的调用是使用内联定义还是使用外部定义.

如果我理解了这一切,inline那么如果还有一个具有相同名称的外部函数,那么具有上例中定义的函数的编译单元只会一致地编译,而且我永远不知道我自己的函数或外部函数是否被调用.

这种行为不是完全愚蠢吗?在inline没有staticextern在C99中定义函数是否有用?我错过了什么吗?

答案摘要

当然我错过了什么,行为并不愚蠢.:)

正如Nemo所解释的那样,我们的想法是定义函数

inline void f() {}
Run Code Online (Sandbox Code Playgroud)

在头文件中只有一个声明

extern inline void f();
Run Code Online (Sandbox Code Playgroud)

在相应的.c文件中.只有extern声明才会触发生成外部可见的二进制代码.确实没有inline在.c文件中使用 - 它只在标题中有用.

正如Jonathan的回答中引用的C99委员会基本原理所阐述的那样,inline所有关于编译器优化都需要在调用的站点上看到函数的定义.这只能通过将标题放在标题中来实现,当然,标题中的定义在编译器每次看到它时都不能发出代码.但由于编译器不是强制实际内联函数,因此必须在某处存在外部定义.

c inline c99

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

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

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

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

c static extern inline-functions

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

为什么将C函数声明为静态内联?

我遇到了一个声明为C函数的例子:

static inline CGPoint SOCGPointAdd(const CGPoint a, const CGPoint b) {
    return CGPointMake(a.x + b.x, a.y + b.y);
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我在.h文件中声明了实用程序C函数并在.m文件中实现它们,就像这样:

CGPoint SOCGPointAdd(const CGPoint a, const CGPoint b) {
    return CGPointMake(a.x + b.x, a.y + b.y);
}
Run Code Online (Sandbox Code Playgroud)

我可以在任何我想要的地方"内联"使用这个函数,它也应该是"静态的",因为它不与任何对象相关联,比如Objective-c方法.指定"静态"和"内联"的重点是什么?

c objective-c

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

头文件中定义的小函数:内联还是静态?

我有一些在.h文件中定义的小函数.这是一个小项目(现在),我想避免将声明和定义分开的痛苦,因为它们一直在变化.为了避免多重定义的符号,我可以拥有它们staticinline.什么应该是首选,为什么?

我知道在头文件中定义函数通常是不好的做法.您不必在答案中提及,这个问题在技术上意味着.

c static inline header-files

20
推荐指数
1
解决办法
3万
查看次数

何时在C中使用类似函数的宏

今天晚上我正在阅读一些用C编写的代码,文件顶部是类似函数的宏HASH:

#define HASH(fp) (((unsigned long)fp)%NHASH)
Run Code Online (Sandbox Code Playgroud)

这让我想知道,为什么有人会选择使用类似函数的宏来实现这种函数,而不是将它作为常规的vanilla C函数实现?每种实施的优缺点是什么?

谢谢你!

c function c-preprocessor

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

__always_inline和inline之间的区别

inline另一个问题上使用指令有很好的解释

谁能解释一下在头文件上使用inline和有什么区别__always_inline吗?

而且,什么时候我更喜欢而__always_inline不是inline相反?

c compiler-construction inline

5
推荐指数
2
解决办法
4455
查看次数

访问静态变量时内联函数和静态内联函数之间的差异

我在阅读其他代码时遇到了一个有趣的案例.

在头文件中,定义了一个静态变量和一个内联函数,简化如下:

static int ply;

inline int WTM(){return ply;}
Run Code Online (Sandbox Code Playgroud)

并在cpp包含此头的其他文件中调用该函数.

cout << ply << " " << WTM();
Run Code Online (Sandbox Code Playgroud)

奇怪的是,在调用此函数的位置,ply内联函数内部的变量与函数外部之前的相同变量具有不同的值.

输出为0 1;

我检查了所有的文件,并都plyWTM()只有这个单一的定义.

之后我将代码更改为以下内容:

static int ply;

static inline int WTM(){return ply;}
Run Code Online (Sandbox Code Playgroud)

这两个值变得相同.

我的编译器g++ (GCC) 4.4.7使用默认设置.

我搜索了这个现象并得到了这两个链接: 内联函数和静态内联函数之间的区别http://gcc.gnu.org/onlinedocs/gcc/Inline.html 但仍然不明白为什么会发生这种情况(特别是为什么他们在第一种情况下可能有不同的价值观).我想知道是否有人可以告诉我编译器将如何扩展这两段代码(我尝试使用-E但似乎没有在内联函数上工作).

c++ static gcc inline

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