2017-02-24 7 views
2

セマンティクスを表現するための良い方法は、「この関数は常にCの定数値を返すでしょうか?常に定数を返すC関数

私は、読み取り専用レジスタを読み込み、潜在的にそれらのシフトやマスクを行うインラインアセンブリ関数について考えています。明らかに、実行時に関数の戻り値は変更されません。コンパイラはインライン展開や関数の呼び出しを常に避けることができますが、代わりに指定されたスコープ内の最初の呼び出しから値を再利用することを目指しています。

const int that_const_value() 
{ 
    return (ro_register >> 16) & 0xff; 
} 

私は値を保存して再利用することができました。しかし、例えば、他のマクロ拡張を介して、この関数への間接呼び出しが存在する可能性があります。

#define that_bit() that_const_value() & 0x1 
#define other_bit() that_const_value() & 0x2 

... 
if (that_bit()) { 
    ... 
} 
... 
if (other_bit()) { 
    ... 
} 

constとして本来の機能を定義すると、それをカットするように見える、または少なくとも例では私が試したことはありません。

+4

は、あなたの関数をインライン化や 'の#define that_const_value(代わりにマクロを定義する)((ro_register >> 16)&0xffの)' –

+2

のいずれかのマクロは単なるテキスト置換されているので、あなたが必要なのはそういうことです。マクロは、あなたが本当に望む結果であなたが望む構文を可能にします。 –

+3

GCCには '__attribute __((__ pure __))'があります。 – melpomene

答えて

0

私は私が正しくあなたの質問を理解していますが、このような解決策を探していることを100パーセントを確認していない:あなたが行うことができますので

#define that_const_value ((ro_register >> 16) &0xff) 
#define that_bit   (that_const_value & 0x1) 
#define other_bit  (that_const_value & 0x2) 

これはちょうど、compille一度にすべてを「置き換える」になります。

if(that_bit) 
{ 
    //Do That 
} 
if(other_bit) 
{ 
    //Do Other 
}