Müssen alle Qulifier im Prototyp stehen? (const, volatile)
-
Hallo zusammen,
ist es zulässig den Prototyp
Return_Type functionname(Type1 Param1, Type2 Param2);
zu haben, wenn der Kopf der Implementierung so aussieht:
Return_Type functionname(const Type1 Param1, Type2 Param2) { ...
?
Desweiteren, wüsste ich gern wie ihr volatile-Variablen zusammen mit (Inline-)Funktionen verwendet. Wenn man nämlich eine Funktion hat wie:
int something(int* ptr, int x);
und man dieser Funktion dann beim Aufruf die Adresse einer volatile-Variablen an "ptr" übergeben will, gibt es ein Compiler-Error/Warining.
Wäre es ratsam die Funktion zu
int something(volatile int* ptr, int x);
deklarieren?
Gruß
-
stefan-tiger schrieb:
ist es zulässig den Prototyp
Return_Type functionname(Type1 Param1, Type2 Param2);
zu haben, wenn der Kopf der Implementierung so aussieht:
Return_Type functionname(const Type1 Param1, Type2 Param2) { ...
Natürlich nicht. Type1 und const Type1 sind zwei unterschiedliche Typen. Mir fällt dafür jetzt auch keine sinnvolle Verwendung ein.
Verwechselst du vielleicht Implementation mit Aufruf? Denn irgendwie wirkt das gerade bei deinem letzten Beispiel mit volatile so.
Zu volatile:
Nein ist es nicht. Hast du eine konkrete Verwendung dafür?
-
FrEEzE2046 schrieb:
Natürlich nicht. Type1 und const Type1 sind zwei unterschiedliche Typen. Mir fällt dafür jetzt auch keine sinnvolle Verwendung ein.
Das const ist in dem Fall aber nur interessant für die Implementierung der Funktion, nicht für den Aufrufer, also finde ich das nicht so "natürlich", dass das nicht gehen soll. Ich finde allerdings auch auf die Schnelle nichts, was das beweist. Habe es auch nicht ausprobiert.
-
const wirkt ja nur nach innen, also für die Implementierung, nicht für den Aufrufer.
Folgender Fall:
Wenn ich ein Interface ohne const bei den Parametern habe, habe ich quasi einen allgemeinen Prototypen. Dem kann ich dann eine Implementierung geben, z.B ohne const wie der Prototyp.
Jetzt merk ich später, dass es geschickt wäre wenn ich z.B. bestimmte Parameter mit const (Wert oder Adresse oder beides) belegen würde.
Der Prototyp ist allerdings schon veröffentlicht worden und darf nichtmehr geändert werden.Ein kleiner Test hat gezeigt, dass wenn ich den Prototyp ohne const lasse, aber bei der Implementierung die Parameter mit const belege die Pointer sind (Call-by-Reference), dann bekomme ich Compiler Warnings/Errors. Bei Call-by-Value Parametern scheint es problemlos zu gehen.
Diesen Unterschied verstehe ich nicht und ich würde gern wissen ob man dies üblicherweise so macht?
Ich meine gelesen zu haben, dass der C-Standard besagt, dass ein Interface
int bla(int a, int b)
zu einem Interface
int bla(const int a, const int b)
kompatibel sei. Leider weiss ich nichtmehr wo und was hier mit kompatibel gemeint ist.