&gt; Anyway, that&#x27;s all to say, IMHO the goal of a compiler is to take as input 1. code represented in some standard grammar, and 2. configuration represented in a compiler-specific format, and combine these to generate a build artifact.<p>Then, what you really are doing is defining a new language. And one with a horrible syntax at that. If the &quot;code&quot; alone does not actually describe what the program is supposed to do, that &quot;configuration&quot; becomes part of the program (if the binary&#x27;s behaviour changes depending on whether you compile it with or without the &quot;configuration&quot;, it is obviously part of the code), and having parts of your program kindof &quot;out of band&quot; is about the worst idea ever for auditing and maintenance, and for general readability. Also, given that that part of your new language is not part of the C standard, say, you cannot use any C compiler to compile it. If you are lucky, you find another compiler that implements another new language based on C with a different syntax for the &quot;configuration&quot; that provides the same semantics, then you can start porting from your own new language to that compiler&#x27;s new language, and then maintain two implementations of that part of your code (erm, &quot;configuration&quot;).<p>If you want to create a new language with better semantics, better invent one with sane, in-band, syntax. If you want to write C ... well, then write C, C is turing complete, so you can express anything you need in it, and every (non-buggy) C compiler will understand it.<p>&gt; My real expectation, though, is that your compiler would actually run through your source files interactively, asking you questions where it thinks things are vague and recording the answers in its hint files, only actually doing a compilation pass once all its questions have been answered.<p>I think that that can&#x27;t work. There are just so many places where it&#x27;s somewhere between extremely hard and impossible for a C compiler to prove that undefined behaviour cannot happen that you probably would need a dozen annotations for every line of your code. Plus, keeping track of how the recorded annotations map to the code after it has been modified is extremely fragile, so if you wanted to be sure, you&#x27;d have to answer all the questions for a source file again after any semantic change you make.