Attribute (auch Pragmas genannt) sind Compiler-Anweisungen, die mit @ beginnen und vor einer Deklaration stehen. Sie steuern Optimierungen, Sicherheits-Verifikation, Speicherlayout und FFI-Verhalten. Attribute verändern nie die Semantik des Programms für korrekte Eingaben — sie sind Zusatzinformationen für den Compiler, nicht für den Laufzeit-Interpreter.
→ Compiler-Flags (CLI) · DO-178C Compliance · Energy-Aware Modell · FFI – C-Interop
Alle Attribute auf einen Blick:
| Attribut | Ziel | Kategorie | Beschreibung |
|---|---|---|---|
@dal(A–D) | Unit, Fn | Safety | Design Assurance Level nach DO-178C |
@flight_crit | Unit, Fn | Safety | Strikte Luftfahrt-Regeln (kein Heap, kein FP-Opt) |
@integrity(…) | Unit, Fn | Safety | Memory Scrubbing oder Software Lockstep |
@redundant | Variable | Safety | Triple Modular Redundancy (TMR) |
@stack_limit(N) | Fn | Safety | Maximaler Stack-Verbrauch in Bytes |
@wcet(N) | Fn | Safety | Worst-Case Execution Time in Zyklen |
@energy(1–5) | Unit, Fn | Performance | Energy-Aware-Backend-Level |
@inline | Fn | Performance | Inlining erzwingen |
@noinline | Fn | Performance | Inlining verbieten |
@no_opt | Fn | Performance | Alle IR-Optimierungen deaktivieren |
@parallel | Loop, Array | Performance | SIMD-Vektorisierung erlauben |
@section(„name“) | Fn, Var | Layout | ELF-Sektion explizit setzen |
@packed | Struct | Layout | Struct-Padding unterdrücken |
@at(N) | Struct-Feld | Layout | Explizites Byte-Offset eines Struct-Felds |
@big_endian | Struct-Feld | Layout | Mehrbyte-Feld als Big-Endian interpretieren |
@volatile | Variable | FFI | Speicherzugriff nicht wegoptimieren |
@extern | Fn | FFI | Externe C/Assembly-Funktion deklarieren |
@export | Fn, Var | FFI | Symbol in Shared Library exportieren |
@stdcall | Fn | FFI |
@extern
@stdcall
fn MessageBoxA(hwnd: int64, text: pchar, caption: pchar, utype: int64): int64;
@extern
@stdcall
fn CreateFileA(lpFileName: pchar, dwAccess: int64, dwShare: int64,
lpSecurity: int64, dwCreation: int64, dwFlags: int64,
hTemplate: int64): int64;
Markiert eine Funktion als C-varargs-Wrapper. Ermöglicht die Weitergabe variabler Argumentlisten an externe C-Funktionen.
@extern
@variadic
fn printf(fmt: pchar): int64;
@extern
@variadic
fn snprintf(buf: pchar, size: int64, fmt: pchar): int64;
@variadic ist ausschließlich für @extern-DeklarationenNicht alle Attribute sind kompatibel. Hier die wichtigsten Einschränkungen:
| Kombination | Erlaubt? | Hinweis |
|---|---|---|
@flight_crit + @energy(1) | ✅ | @energy(1) ist implizit, explizit redundant aber harmlos |
@flight_crit + @energy(2) | ✅ | Erfordert @dal(B) oder explizite @allow_unsafe-Begründung |
@flight_crit + @energy(4/5) | ❌ | Compiler-Fehler: widerspricht der No-Speculation-Anforderung |
@integrity(lockstep) + @inline | ❌ | Lockstep erfordert definierte Call-Grenzen |
@integrity(lockstep) + @extern | ❌ | Externe Funktionen können nicht dupliziert werden |
@redundant auf Stack-Variable | ❌ | Nur für global/Unit-Level |
@parallel + @no_opt | ❌ | @no_opt deaktiviert SIMD-Vektorisierung |
@dal(A) + unsafe (ohne @allow_unsafe) | ❌ | Compiler-Fehler |
@packed + @section | ✅ | Häufige Kombination für Hardware-Register-Structs |
@at(N) + @packed | ✅ | @packed entfernt implizites Padding; @at legt Positionen absolut fest |
@at(N) + @big_endian | ✅ | Standardkombination für Netzwerk-Header-Felder |
@big_endian ohne @at(N) | ❌ | Compiler-Fehler: Offset-Angabe fehlt |
@at(N) + Feld ohne @at in derselben Struct | ❌ | Compiler-Fehler: gemischtes Layout nicht erlaubt |
@volatile + @no_opt | ✅ | Maximale Garantie gegen Compiler-Umordnung |
@extern + @stdcall | ✅ | Standard für Windows-API |
@extern + @variadic | ✅ | Standard für printf-Familie |
Letzte Aktualisierung: 2026-06-06