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.

