This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: concatenating __FUNCTION__
- From: "Claudio Bley" <bley at cs dot uni-magdeburg dot de>
- To: Kevin Nomura <nomura at netapp dot com>
- Cc: gcc-help at gcc dot gnu dot org
- Date: Thu, 21 Feb 2002 18:56:48 +0100
- Subject: Re: concatenating __FUNCTION__
- References: <3C752643.BA5F7756@netapp.com>
>>>>> "Kevin" == Kevin Nomura <nomura@netapp.com> writes:
Kevin> gcc 3.0 warns about concatenating __FUNCTION__ with a
Kevin> string literal:
Kevin> [tyrell]$ gcc-3.0.3/bin/gcc a.c a.c: In function `main':
Kevin> a.c:3: warning: concatenation of string literals with
Kevin> __FUNCTION__ is deprecated. This feature will be removed
Kevin> in future [tyrell]$ cat a.c main() { printf ("%s\n",
Kevin> __FUNCTION__ "hi"); }
Kevin> I find this odd given that the manual explicitly calls out
Kevin> this capability as a feature (section 5.41, "Function Names
Kevin> as Strings") in contrast with __func__:
Kevin> "This means that they catenate with other string literals,
Kevin> and that they can be used to initialize char arrays".
Kevin> I see no mention of deprecation. Initializing a char array
Kevin> with __FUNCTION__ does not get a warning.
Kevin> Is __FUNCTION__ itself deprecated? (If not, why would the
Kevin> existing ability to concatenate it be dropped?) Thanks in
Kevin> advance for clarification.
To quote the gcc info manual:
,----
| The compiler automagically replaces the identifiers with a string
| literal containing the appropriate name. Thus, they are neither
| preprocessor macros, like `__FILE__' and `__LINE__', nor variables.
| This means that they catenate with other string literals, and that they
| can be used to initialize char arrays.
|
| [...]
|
| Note that these semantics are deprecated, and that GCC 3.2 will
| handle `__FUNCTION__' and `__PRETTY_FUNCTION__' the same way as
| `__func__'. `__func__' is defined by the ISO standard C99:
|
| The identifier `__func__' is implicitly declared by the translator
| as if, immediately following the opening brace of each function
| definition, the declaration
| static const char __func__[] = "function-name";
|
| appeared, where function-name is the name of the lexically-enclosing
| function. This name is the unadorned name of the function.
|
| By this definition, `__func__' is a variable, not a string literal.
| In particular, `__func__' does not catenate with other string literals.
`----
Claudio