2017-02-24 5 views
2

Was ist ein guter Weg, um die Semantik auszudrücken "diese Funktion wird immer einen konstanten Wert" in C?C-Funktionen, die immer konstant

Ich denke über Inline-Assembly-Funktionen nach, die schreibgeschützte Register lesen und möglicherweise verschieben und/oder sie maskieren. Während der Laufzeit wird sich der Rückgabewert der Funktion natürlich nicht ändern. Daher kann der Compiler möglicherweise die ganze Zeit das Inlinen oder Aufrufen der Funktion vermeiden, stattdessen aber versuchen, den Wert aus dem ersten Aufruf in einem bestimmten Bereich wiederzuverwenden.

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

Ich könnte den Wert speichern und wiederverwenden. Aber es könnte indirekte Aufrufe an diese Funktion geben, sagen wir, durch andere Makro-Erweiterungen.

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

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

Definition der ursprünglichen Funktion als const scheint nicht zu schneiden, oder zumindest in den Beispielen habe ich versucht.

+4

entweder Ihre Funktion inline oder einen Makro statt '#define that_const_value() ((ro_register >> 16) & 0xff) definieren' –

+2

Da Makros nur das Ersetzen von Text ist, alles, was Sie brauchen, ist, dass nur. Ein Makro erlaubt die gewünschte Syntax mit dem Ergebnis, das Sie wirklich wollen. –

+3

GCC hat dafür '__attribute __ ((__ pure __))'. – melpomene

Antwort

0

Ich bin nicht zu 100 Prozent sicher, dass ich Ihre Frage richtig verstanden habe, aber suchen Sie nach einer Lösung wie folgt aus:

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

Dies würde nur ‚ersetzen‘ alles in compille Zeit, so dass Sie tun können:

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