macro definition contains #include directive

B

Bing

Hi folks,
Is there a way to define a macro that may contain #include
directive in its body. If I just put
the "#include", it gives error C2162: "expected macro formal
parameter" since here I am not using
# to concatenate strings. If I use "\# include", then I receive the
following two errors:

error C2017: illegal escape sequence
error C2121: '#' : invalid character : possibly the result of a macro
expansion

Any help?

Thanks,
Bing Jian
 
P

Pawel Dziepak

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
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-----
 
N

Noah Roberts

Bing said:
Hi folks,
Is there a way to define a macro that may contain #include
directive in its body. If I just put
the "#include", it gives error C2162: "expected macro formal
parameter" since here I am not using
# to concatenate strings. If I use "\# include", then I receive the
following two errors:

error C2017: illegal escape sequence
error C2121: '#' : invalid character : possibly the result of a macro
expansion

Any help?

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.
 
P

Pawel Dziepak

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Noah said:
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-----
 
J

James Kanze

Is there a way to define a macro that may contain #include
directive in its body. If I just put the "#include", it
gives error C2162: "expected macro formal parameter" since
here I am not using # to concatenate strings. If I use "\#
include", then I receive the following two errors:
error C2017: illegal escape sequence
error C2121: '#' : invalid character : possibly the result of a macro
expansion
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?
 
P

Pascal J. Bourguignon

Bing said:
Hi folks,
Is there a way to define a macro that may contain #include
directive in its body. If I just put
the "#include", it gives error C2162: "expected macro formal
parameter" since here I am not using
# to concatenate strings. If I use "\# include", then I receive the
following two errors:

error C2017: illegal escape sequence
error C2121: '#' : invalid character : possibly the result of a macro
expansion

Any help?

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 ****/
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,048
Latest member
verona

Latest Threads

Top