Re: replacement for macro with # and ##
From: Victor Bazarov (v.Abazarov_at_comAcast.net)
Date: 12/01/04
- Next message: Peter Ashford: "Re: C++ sucks for games.... oh really?"
- Previous message: Basat: "Want to purchase Watcom c/c++ version 10.5"
- In reply to: jjleto: "Re: replacement for macro with # and ##"
- Next in thread: maninalift_at_another.com: "Re: replacement for macro with # and ##"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Date: Wed, 01 Dec 2004 16:18:08 -0500
jjleto wrote:
> Victor Bazarov a écrit :
>
>> jjleto wrote:
>>
>>> I have a C program that uses in some parts macros with # and ## like in:
>>>
>>> #define GET_FUNC_DECL(name) char *get##name();
>>>
>>> #define GET_FUNC_IMPL(name) char *get##name() { /* some stuff */;
>>> return #name; }
>>>
>>>
>>> Is there a way to achieve this without macros in C++ ? With templates
>>> perhaps ?
>>
>>
>>
>> It depends on what you mean by "this". Preprocessor macros are a way to
>> substitute one string in the source code with another while performing
>> some operations like converting to literals or merging tokens. It is all
>> done before the compiler gets to it. Templates are a way to make
>> compiler
>> generate code when needed based on arguments provided.
>
>
> I understand that. But after preprocessing and compiling, we end with
> code generated for the macros/templates (although completely
> differentely I guess)
>
>> What exactly are you trying to accomplish?
>>
>> V
>
>
> I just try to get rid of the macros.
Why?
> I was thinking of something like
>
> template<char *name>
> char *get()
> {
> /* ... */
> return name;
> }
>
> and a call like
>
> get< "foo" >();
>
> But this does not compile.
And it won't. String literals have internal linkage, therefore they
cannot be used as template arguments. But that's not the actual issue
here, is it?
Again, what are you trying to accomplish? Why not, for example, have
the _function_ argument instead of the template argument:
char* get(const char* whattoget) {
if (isname(whattoget))
return name;
else if (issomethingelse(whattoget))
return somethingelse;
else
return NULL;
}
Yes, that's run-time behaviour, not compile-time.
"Getting rid of macros" should not be the goal to pursue. Macros are just
as part of the C++ language as templates, and they are not on their way
out, and won't be any time soon. If they help you organize the code and
make it easier to write and understand, why get rid of them?
Victor
- Next message: Peter Ashford: "Re: C++ sucks for games.... oh really?"
- Previous message: Basat: "Want to purchase Watcom c/c++ version 10.5"
- In reply to: jjleto: "Re: replacement for macro with # and ##"
- Next in thread: maninalift_at_another.com: "Re: replacement for macro with # and ##"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Relevant Pages
|