Re: Creating unique temporary variables using __LINE__ or other macro
travis.downs@gmail.com wrote:
:: On Aug 14, 3:00 pm, "Victor Bazarov" <v.Abaza...@comAcast.net>
:: wrote:
::: travis.do...@gmail.com wrote:
:::: I'm trying to use a macro to create a unique temporary variable
:::: name, such as
:::
:::: #define TEMP_OBJ(string) MyType obj_ <some magic here>
:::: (string);
:::
::: Drop the semicolon after the macro definition.
:::
:::
:::
:::: So something like
:::
:::: TEMP_OBJ("foo")
:::
:::: would evaluate to
:::
:::: MyType obj_1234("foo");
:::
:::: Where the 1234 is needed to make it unique. Thing is, I can't
:::: find a good way to make this unique stuff. I tried __LINE__,
:::: but I could find a way to paste it to obj_ to make the variable
:::: name.
:::
:::: Any ideas? Surely there must be a common idiom for this.
:::
::: I used
:::
::: #define CONCAT(a, b) a ## b
::: #define UNIQUENAME(prefix) CONCAT(prefix, __LINE__)
:::
::: Which then gets used in another macro
:::
::: #define PROFILER_ENTRY() \
::: static MyProfiler::Entry * UNIQUENAME(ppe) = \
::: MyProfiler::Instance().addEntry(... /* some other
::: stuff */ #define PROFILE_THIS PROFILER_ENTRY
::: ...
::: int foo() {
::: PROFILE_THIS();
:::
::: V
::: --
::: Please remove capital 'A's when replying by e-mail
::: I do not respond to top-posted replies, please don't ask
::
:: Thanks very much for your response. I had already tried something
:: very similar (although I had one less level of indirection - no
:: PROFILE_THIS, just PROFILER_ENTRY). I tried your suggestion
:: exactly __LINE__ does not get expanded for me, so I get an error
:: about ppe__LINE__ being redeclared. I cannot make __LINE__ expand
:: out before the concat, which is very frustrating.
If you by any chance use MSVC with precompiled headers, this is a
known bug there. The __LINE__ value is set when the header is
(pre)compiled, not when your source file is compiled.
The workaround offered is to use __COUNTER__ instead of __LINE__.
Bo Persson