The header

// app.hh
//
// Generated by mstring 1.3.0 from app.msg. Do not edit: edit the message file
// and run mstring again.

#ifndef MSTRING_APP_HH
#define MSTRING_APP_HH

#include <iosfwd>          // $STREAMABLE
#include <locale>
#include <string>          // $STRING, $EXCEPTION, $THROW
#include <type_traits>     // generated classes
#include <exception>       // $EXCEPTION, $THROW
#include <syslog.h>        // $SYSLOG
#include <iomanip>         // your $INCLUDEs follow

namespace app
{
  using std::string;       // your $USINGs

  // classes, then free-function declarations, message by message
}

#endif

The include guard is MSTRING_ + the file name, upper-cased, with every other character turned into _.

The source

#include "app.hh"

#include <sstream>
#include <string>
#include <charconv>        // string builders
...
#include <cstdlib>         // $ERROR
#include <iostream>        // $ERROR

namespace
{
namespace mstring_local_v1
{
  // helpers: locale matching, value appending
}
}

namespace app
{
  // per message: text functions, then the artefacts' definitions
}

With NOHEADER the source starts with the header's content (without the guard) instead of the #include.

Rewriting

A file is only written when its new content differs from what is on disk, so its timestamp — and everything that depends on it — stays put when the message file changes in a way that does not affect it.