相关疑难解决方法(0)

C内联函数和"未定义外部"错误

我正在尝试用内联函数替换一些宏子程序,因此编译器可以优化它们,因此调试器可以进入它们,等等.如果我将它们定义为普通函数,它可以工作:

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文件中使用它们,我在哪里放入内联函数?)

c external inline-functions

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

头文件中的内联与静态内联

要将inline函数定义放在C头文件中以便应该内联到多个其他单元的函数中,应该使用inline还是static inline应该使用?我一直在谷歌搜索一段时间,但到目前为止似乎没有简明的解释.

c static inline-functions

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

内联函数多重定义

我有以下三个文件:

inline_header.h

#ifndef INLINE_HEADER_H
#define INLINE_HEADER_H

inline int func1() {
    return 1;
}

#endif
Run Code Online (Sandbox Code Playgroud)

source1.c

#include "inline_header.h"
Run Code Online (Sandbox Code Playgroud)

source2.c

#include "inline_header.h"

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

当我编译只是source2.cgcc 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进行编译.

我试过看了这个,发现了一个类似的问题,内联函数的多个定义.但是在他的情况下,错误是由他的内联函数的重新定义引起的.就我而言,我没有重新定义它(或者至少没有明确地......).

c gcc inline

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

-O0处的内联函数导致clang中的链接失败

我正在尝试使用各种优化级别的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 optimization inline c99 clang

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

有关内联性能的问题

我对在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)
  1. 它到底是做什么的,为什么它可以帮助代码更快地运行?这是90年代的过时优化吗?

  2. 为什么我只能在小型函数上使用它?如果我为大型功能这样做会不好吗?

  3. 在大量功能上使用它是否不好?

c c++ optimization inline

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

标签 统计

c ×5

inline ×3

inline-functions ×2

optimization ×2

c++ ×1

c99 ×1

clang ×1

external ×1

gcc ×1

static ×1