2017-12-29 21 views
1

私が作っている小さなゲームのための簡単なヘルパーライブラリーを作った。このようなライブラリでは、ゲームフレームあたり何千回も呼び出されるため、できるだけ早く実行する必要があるいくつかのコア機能があります。ヘッダーのみのライブラリーを複数回含む場合の重複シンボル

私は「インライン」、それらを宣言し、その実施(library.c)から自分の宣言(library.h)を分割し、ゲームファイル(game.c)でそれらを含めると、私は彼らがgame.cで直接それらを宣言するため、最適化/インライン化していないと思いますgcc -O3でゲームをコンパイルすると、その60倍以上のパフォーマンスが向上します。

この問題を解決するために、私は自分のライブラリをヘッダーのみのライブラリにすることにしました。 library.hに私のフレームワークの定数、vars、関数があります。 game.cにそれを含めても、私には最高のパフォーマンスが得られます。

さて、問題は、私は複数のファイル(たとえばgame1.cgame2.c)でlibrary.hを含めいつでもゲームをコンパイルするとき、私はduplicate symbolエラーの長いリストを取得することです。ライブラリは#pragma onceですが、それでも問題が発生します。

実際にヘッダー専用ライブラリを作成する方法、または外部ライブラリのインライン関数が実際に最適化されていることを確認する方法はありますか?すでにコメントアルクとして

おかげ

+3

ヘッダーファイルに変数や関数を定義していますか? –

+1

ヘッダ内の変数を宣言し、定義用に別々の '.c'ファイルを作成するだけです。 – qwn

+0

関数' static'を宣言したいとします。 – alk

答えて

2

、あなたはヘッダファイルstaticで関数とグローバル変数を宣言する必要があります。

キーワードstaticは、オブジェクト(関数または変数)が内部リンクを持っていることを意味します。現在のコンパイル単位でのみ表示され、シンボルテーブルには含まれません。

また、インクルードガードを使用することをお勧めします。ヘッダーファイルを含むヘッダーファイルがあり、Cソースファイルにヘッダーファイルとその他のヘッダーファイルの両方が含まれている場合は、一度。 (FOOLIB_H有する株は、以下の例に含まれるガードを含む。)

を以下の些細な固定サイズのスタックの例を考え、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ではなく、機能static inlineをマークする理由は、前者は、関数が使用されていなければ機能を完全に省略してもよいことをコンパイラーに伝えるからです。特に、gcc -Wallでコードをコンパイルすると、static関数が使用されていないと警告されますが、static inline関数が使用されていない場合、警告は表示されません。それ以外には、それほど実用的な違いはありません。

関連する問題