#assert-Direktive

Die #assert-Direktive dient dazu, mehr oder weniger standartisierte Prädikate zu definieren, wie beispielsweise, um den Prozessortyp anzugeben. Da sich jedoch niemals ein Standard durchsetzte, sind diese Prädikate unsicher, da sie von System zu System verschieden gehandhabt, benannt und teilweise ganz weggelassen werden. Vom Gebrauch der #assert-Direktive im allgemeinen Programmieralltag wird somit ABGERATEN.

Details

Die #assert-Direktive definiert Prädikate, wobei ein Prädikat mit Antwort auf eine Frage umschrieben werden kann. Die #assert-Direktive legt fest, welches die einzig gültige Antwort für ein Prädikat ist. Die Antwort auf ein Prädikat wird dabei in runde Klammern () geschrieben. Um das Prädikat mittels der #if-Direktive abzufragen, muss dem Prädikat ein # vorangestellt werden. Die zu überprüfende Antwort wird wiederum in runde Klammern () geschrieben.








Hallo Welt!
#include <stdio.h>
#assert language(de)

int main(){
  #if #language(en)
    printf("Hello World!\n");
  #elif #language(de)
    printf("Hallo Welt!\n");
  #endif
  return 0;
}

Um abzufragen, ob überhaupt irgend ein Wert für ein Prädikat gesetzt wurde, kann die Antwort inklusive den Klammern einfach weggelassen werden. Um ein Prädikat neu zu definieren, können die Angaben mit einer erneuten #assert-Direktive überschrieben werden. Um das Prädikat zu löschen, wird die #unassert-Direktive benötigt.

Ein Beispiel: Auf gewissen Systemen sei ein Prädikat namens endian definiert, welches zwei Antworten haben kann: little und big. Damit könnte automatisch ermittelt werden, ob der Prozessor das Little- oder Big-Endian-Format unterstützt und die Compilierung dementsprechend gesteuert werden. Das verwendete System des Autors brachte jedoch hervor, dass dieses Prädikat nicht definiert sei:











Predicate undefined.
#include <stdio.h>

int main(){
  #if #endian(big)
    printf("Big Endian\n");
  #elif #endian(little)
    printf("Little Endian\n");
  #elif #endian
    printf("Some kind of Endian\n");
  #else
    printf("Predicate undefined.\n");
  #endif
  return 0;
}