gpt4 book ai didi

c - 多次包含仅 header 库时出现重复符号

转载 作者:太空宇宙 更新时间:2023-11-04 02:28:05 27 4
gpt4 key购买 nike

我为我正在制作的小游戏制作了一个简单的帮助程序库。在这样的库中,我有一些必须尽可能快地执行的核心函数,因为它们在每个游戏帧中被调用数千次。

如果我将它们声明为“内联”并将它们的声明 (library.h) 从它们的实现 (library.c) 中分离出来,并将它们包含在游戏文件中 (game.c),我猜它们没有内联/优化,因为直接在 game.c 中声明它们并使用 gcc -O3 编译游戏使我的性能提升超过 60 倍。

为了解决这个问题,我决定让我的库成为一个只有头文件的库。我在 library.h 中有我所有的框架常量、变量和函数。将它包含在 game.c 中仍然给我最大的性能。

现在,问题是每当我在多个文件中包含 library.h(比如 game1.cgame2.c ) 我在编译游戏时收到一长串 duplicate symbol 错误。该库有 #pragma once 但问题仍然存在。

如何实际编写仅包含头文件的库或确保来自外部库的内联函数真正得到优化?

谢谢

最佳答案

正如 alk 已经评论的那样,您需要在头文件 static 中声明函数和全局变量。

static 关键字表示对象(函数或变量)具有内部链接;它只在当前编译单元可见,不会包含在任何符号表中。

使用 include guard 也是一个好主意,这样如果您有另一个包含您的头文件的头文件,并且 C 源文件同时包含您的头文件和另一个头文件,您的头文件只会被包含一次. (带有 FOOLIB_H 的行构成了下面示例中的 include guard。)

考虑以下简单的固定大小堆栈示例,foolib.h:

#ifndef   FOOLIB_H
#define FOOLIB_H

#include <stdlib.h>

#define STACK_MAX 256

static size_t stack_size = 0;
static double stack_item[STACK_MAX];

static inline int stack_push(const double item)
{
if (stack_size < STACK_MAX) {
stack_item[stack_size++] = item;
return 0;
} else
return -1;
}

static inline double stack_pop(const double empty)
{
if (stack_size > 0)
return stack_item[--stack_size];
else
return empty;
}

#endif /* FOOLIB_H */

包含上述内容 (#include "foolib.h") 的每个编译单元(您单独编译的每个源文件),通过 stack_push( )stack_pop()

将函数标记为 static inline 而不仅仅是 static 的原因是前者告诉编译器可以完全省略函数,如果不是用过的。特别是,如果您使用 gcc -Wall 编译代码,则 gcc 会在未使用 static 函数时发出警告,但在 static inline 时不会发出警告> 未使用功能。除此之外,没有太大的实际区别。

关于c - 多次包含仅 header 库时出现重复符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48020778/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com