我正在尝试用内联函数替换一些宏子程序,因此编译器可以优化它们,因此调试器可以进入它们,等等.如果我将它们定义为普通函数,它可以工作:
void do_something(void)
{
blah;
}
void main(void)
{
do_something();
}
Run Code Online (Sandbox Code Playgroud)
但如果我将它们定义为内联:
inline void do_something(void)
{
blah;
}
void main(void)
{
do_something();
}
Run Code Online (Sandbox Code Playgroud)
它说"错误:未定义的外部".那是什么意思?在黑暗中刺了一下,我试过了
static inline void do_something(void)
{
blah;
}
void main(void)
{
do_something();
}
Run Code Online (Sandbox Code Playgroud)
没有更多的错误.函数定义和对函数的调用都在同一个.c文件中.
有人可以解释为什么一个有效,另一个没有?
(第二个相关问题:如果我想在多个.c文件中使用它们,我在哪里放入内联函数?)
要将inline函数定义放在C头文件中以便应该内联到多个其他单元的函数中,应该使用inline还是static inline应该使用?我一直在谷歌搜索一段时间,但到目前为止似乎没有简明的解释.
我有以下三个文件:
#ifndef INLINE_HEADER_H
#define INLINE_HEADER_H
inline int func1() {
return 1;
}
#endif
Run Code Online (Sandbox Code Playgroud)
#include "inline_header.h"
Run Code Online (Sandbox Code Playgroud)
#include "inline_header.h"
int main() {
func1();
}
Run Code Online (Sandbox Code Playgroud)
当我编译只是source2.c用gcc source2.c它编译.但是,当我尝试编译时,gcc source1.c source2.c我得到一个多重定义错误,如下所示:
/tmp/cchsOaHF.o: In function `func1':
source2.c:(.text+0x0): multiple definition of `func1'
/tmp/ccEyUW0T.o:source1.c:(.text+0x0): first defined here
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我正在使用Uccntu 14.04上的gcc 4.8.4进行编译.
我试过看了这个,发现了一个类似的问题,内联函数的多个定义.但是在他的情况下,错误是由他的内联函数的重新定义引起的.就我而言,我没有重新定义它(或者至少没有明确地......).
我正在尝试使用各种优化级别的clang编译以下代码:
#include <stdio.h>
inline int foo() { return 42; }
int main() {
printf("%d\n", foo());
}
Run Code Online (Sandbox Code Playgroud)
在-O1,-O2,-O3,和-Os,它编译成功,但使用时失败-O0:
$ clang -O0 -o main main.c
Undefined symbols for architecture x86_64:
"_foo", referenced from:
_main in main-8b9319.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)
Clang的内联兼容性-O0可以解释(和变通方法)的失败,但是无论优化级别如何,我都天真地期望这会失败.似乎一些优化已经启用了一些东西来阻止这种链接错误的发生,但我很好奇它们是什么样的优化,以及为什么它们似乎具有不同于单独使用的语义.-O1inline-O0
我对在C和C ++中的函数上使用内联有一些疑问。有人告诉我在经常使用的小功能上使用它,但是我想确切地了解它是如何工作的。这只是一个示例片段。
static inline point3D createPoint3D(float x, float y, float z){
point3D newPosition;
newPosition.x = x;
newPosition.y = y;
newPosition.z = z;
return newPosition;
}
Run Code Online (Sandbox Code Playgroud)
它到底是做什么的,为什么它可以帮助代码更快地运行?这是90年代的过时优化吗?
为什么我只能在小型函数上使用它?如果我为大型功能这样做会不好吗?
在大量功能上使用它是否不好?