2017-05-25 16 views
0

私は、関数がインライン化されないようにする移植性のある方法を考え出しています。私はこの解決策を見つけました。old answer「いつもうまくいかないかもしれない」というコメントがあります。流れの可能性が高い作業残るだけのこと -移植可能なインライン展開の防止

void (*foo_ptr)() = foo; 
foo_ptr(); 

My機能だけで揮発性をインクリメントされ、目的は、(いくつかのトレースハードウェアの行使)検証のためにPCを制御することである、と私は、周囲のコードを懸念していませんよ私が10年後にこれに戻ったとき(新しいツールチェーンで)属性や組み込みアセンブラを使用しないでください(私は既に3つのツールチェーンをサポートする必要があります)、が表示されます。が今動作します。

私は揮発性のアドレスを渡すことでより多くの保護が得られると考えています。これは必要なのですか、あまり醜いものがありますか?

+0

を使用して、自分自身と矛盾するようです。私はPCをチェックするポータブルな方法を知らない。これは常に特定のツールチェーンに依存します。ほとんどのツールチェーンには、インライン展開を防ぐ手段があります(例えばgccでは '__attribute __((__ noinline __))'など)。 – ensc

+0

私はPCを監視しているハードウェアを持っています - 私はそのハードウェアを試す必要があります(テストしません)。 –

+1

別のファイル(コンパイル単位)に入れ、オブジェクト(またはライブラリ)にコンパイルし、結果のオブジェクトを "メイン"プログラムにリンクします。 – wildplasser

答えて

3

関数がインライン化される可能性を完全に避ける最も簡単な方法は、関数を別のソースファイルに置き、関数をコンパイル時ではなくリンク時に実行可能にすることです。ここ

は一つの方法です:

header_1.h #ifndefのHEADER_1_H の#define HEADER_1_H

void foo(void); 

#endif // HEADER_1_H 

source_1.c

... 
void foo() 
{ 
    // do something 
} 

source_2.c

#include "header_1.h" 

int main(void) 
{ 
    foo(); 
} 

そして、「目的は、検証のためにPCを制御することである」、「ポータブル」になろうと、次のコンパイル/リンク文

gcc -c ... source_1.c -o source_1.o 
gcc -c ... source_2.c -o source_2.o 
gcc source_1.o source_2.o -o source 
関連する問題