error C2017: illegal escape sequence
error C2121: '#' : invalid character : possibly the result of a macro
expansion
Any help?
Thanks,
Bing Jian
Bing wrote:
> Is there a way to define a macro that may contain #include
> directive in its body. If I just put
<snip>
No, preprocessor directives in C++ (and C) are not reflective.
Pawel Dziepak
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org
iEYEARECAAYFAkkR/5QACgkQPFW+cUiIHNrengCgmsl1wT5R9t4lKh2iu+f2xsPO
uNMAn0Q4VWBUeVUkLN6UsDB0FzkE3AY5
=BCqQ
-----END PGP SIGNATURE-----
Look at the boost preprocessor metaprogramming library. The
BOOST_PP_ITERATE() macro is able to do it. See what it's doing or maybe
just use it.
Noah Roberts wrote:
> Look at the boost preprocessor metaprogramming library. The
> BOOST_PP_ITERATE() macro is able to do it. See what it's doing or maybe
> just use it.
Macro can be an argument of #include directive and that's how
BOOST_PP_ITERATE() is used in boost (it's probably the solution for
Bing's problem). However, macro can't contain #include directive.
Pawel Dziepak
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org
iEYEARECAAYFAkkSEnAACgkQPFW+cUiIHNoI5QCfe8p5BsWgNF5Lc/gkTx+wEkLt
vuMAmgL1KlnhEUdUfeHDUjmapG7VWo5D
=ir8y
-----END PGP SIGNATURE-----
Thanks for the answers. Just let you know I started a topic on this at
stackoverflow.com
http://stackoverflow.com/questions/266501/macro-definition-containing-include-directive
> Any help?
No. After expansion, "the resulting completely macro-replaced
preprocessing token sequence is not processed as a preprocessing
directive even if it resembles one" [§16.3.4/3]. In other
words, even if there were a way of introducing a sequence
"#include" in the expansion, it wouldn't be an include
directive.
What problem are you trying to solve with this?
--
James Kanze (GABI Software) email:james...@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
It is not possible with cpp, however it's trivial to do with make and
sed (or awk or anything else):
-----------(Makefile)--------------------------
example.c : example.cm
sed -e 's/EXPAND(\(.*\))/@#define SOMEVAR 1@#include <\1.h>@#define SOMEVAR_\1 2@/g' < example.cm \
|tr '@' '\012' > example.c
# ...
-----------------------------------------------
----------(example.cm)-------------------------
/* -*- mode:c -*- */
EXPAND(ModuleA)
EXPAND(ModuleB)
/**** THE END ****/
-----------------------------------------------
Then typing make example.c will generate the file:
-------------(example.c)------------------------------
/* -*- mode:c -*- */
#define SOMEVAR 1
#include <ModuleA.h>
#define SOMEVAR_ModuleA 2
#define SOMEVAR 1
#include <ModuleB.h>
#define SOMEVAR_ModuleB 2
/**** THE END ****/
-------------------------------------------------------
--
__Pascal Bourguignon__