diff --git a/src/pystencilssfg/context.py b/src/pystencilssfg/context.py
index 69fa58dab860863e5d987aa651ca581ef03b29a0..ef69c06bd9921717fa745f990261fc3fca46dd7a 100644
--- a/src/pystencilssfg/context.py
+++ b/src/pystencilssfg/context.py
@@ -36,6 +36,8 @@ class SfgContext:
         self._functions: dict[str, SfgFunction] = dict()
         self._classes: dict[str, SfgClass] = dict()
 
+        self._declarations_ordered: list[str | SfgFunction | SfgClass] = list()
+
         #   Standard stuff
         self.add_include(SfgHeaderInclude("cstdint", system_header=True))
         self.add_definition("#define RESTRICT __restrict__")
@@ -109,6 +111,7 @@ class SfgContext:
 
     def add_definition(self, definition: str):
         self._definitions.append(definition)
+        self._declarations_ordered.append(definition)
 
     def set_namespace(self, namespace: str):
         if self._inner_namespace is not None:
@@ -151,6 +154,8 @@ class SfgContext:
             raise SfgException(f"Duplicate function: {func.name}")
 
         self._functions[func.name] = func
+        self._declarations_ordered.append(func)
+
         for incl in CollectIncludes().visit(func):
             self.add_include(incl)
 
@@ -169,6 +174,17 @@ class SfgContext:
             raise SfgException(f"Duplicate class: {cls.class_name}")
 
         self._classes[cls.class_name] = cls
+        self._declarations_ordered.append(cls)
 
         for incl in CollectIncludes().visit(cls):
             self.add_include(incl)
+
+    # ----------------------------------------------------------------------------------------------
+    #   Declarations in order of addition
+    # ----------------------------------------------------------------------------------------------
+
+    def declarations_ordered(self) -> Generator[str | SfgFunction | SfgClass, None, None]:
+        """All declared definitions, classes and functions in the order they were added.
+
+        Awareness about order is necessary due to the C++ declare-before-use rules."""
+        yield from self._declarations_ordered
diff --git a/src/pystencilssfg/emission/printers.py b/src/pystencilssfg/emission/printers.py
index 9f0a03fb0557a759a68d064e2a7e0349e6703978..74514b2e44dcde7659008620d18bb2c472d68b5c 100644
--- a/src/pystencilssfg/emission/printers.py
+++ b/src/pystencilssfg/emission/printers.py
@@ -93,11 +93,7 @@ class SfgHeaderPrinter(SfgGeneralPrinter):
             code += f"namespace {fq_namespace} {{\n\n"
 
         parts = interleave(
-            chain(
-                ctx.definitions(),
-                ctx.classes(),
-                ctx.functions()
-            ),
+            ctx.declarations_ordered(),
             repeat(SfgEmptyLines(1))
         )