views:

303

answers:

2

I'm abusing the C preprocessor for my build system to produce a "readme" plain-text file and a web page from the same source file. The construction is something like this:

The actual definitions are in data.h:

#define WEBSITE "http://example.com"

Note that the // in the URL must be quoted, or else it will be treated as the start of a comment. A similar problem occurs when using a , in the argument; the quotes are necessary, or else the comma would be treated as an argument separator.

Using this header, a file readme.txt.pp is run through the C preprocessor:

#include "data.h"
Visit the website at WEBSITE!

Of course, the preprocessor output is:

Visit the website at "http://example.com"!

The quotes appear in the output. Is there any way, or workaround, to get this code to give the output:

Visit the website at http://example.com!

I'm using Visual C++ 2008. I know that the preprocessor is not the ideal tool for this job; suggestions that use other built-in VC++ features are also welcome. (I tried XML with XSLT, but it is impossible to include one XML file into another, which was a show-stopper.)

+2  A: 

Regarding XSLT, have a look at the document() function to read from multiple source documents.

I don't think there's any way to remove the quotes from the value of WEBSITE, since they are there in the definition of the macro. You might consider using the m4 macro processor instead of the C preprocessor.

Greg Hewgill
`document()` is a lifesaver! Reverting back to XSLT now :)
Thomas
A: 

Try disabling the C++ style comments if possible. I don't know how that works in VS, but using a GCC compiler I can pass the -std=c89 flag to gcc to disable C++ style comments and hence making

#define WEBSITE http://example.com

possible.

codaddict
Yes, but not `#define SOMETEXT Hello, world!`, because of the comma.
Thomas