c++ - ¿Por qué__FUNCTION__ no estaría definido?
visual-c++ macros (3)
Tengo una biblioteca C ++ que usa la macro predefinida __FUNCTION__
, por medio de crtdefs.h. La macro está documentada aquí . Aquí está mi uso:
my.cpp
#include <crtdefs.h>
...
void f()
{
L(__FUNCTIONW__ L" : A diagnostic message");
}
static void L(const wchar_t* format, ...)
{
const size_t BUFFERLENGTH = 1024;
wchar_t buf[BUFFERLENGTH] = { 0 };
va_list args;
va_start(args, format);
int count = _vsnwprintf_s(buf, BUFFERLENGTH, _TRUNCATE, format, args);
va_end(args);
if (count != 0)
{
OutputDebugString(buf);
}
}
crtdefs.h
#define __FUNCTIONW__ _STR2WSTR(__FUNCTION__)
La biblioteca (que se compila como una biblioteca estática, si eso importa) es consumida por otro proyecto en la misma solución, una aplicación WPF escrita en C #.
Cuando compilo la lib, obtengo este error:
el identificador "L__FUNCTION__" no está definido.
De acuerdo con los documentos, la macro no se expande si / P o / EP se pasan al compilador. He verificado que no lo son. ¿Hay otras condiciones en las que esta macro no está disponible?
Creo que la definición de __FUNCTIONW__
es incorrecta. (Sé que no lo escribiste).
De: http://gcc.gnu.org/onlinedocs/gcc/Function-Names.html
Estos identificadores no son macros de preprocesador. En GCC 3.3 y anteriores, solo en C,
__FUNCTION__
y__PRETTY_FUNCTION__
se trataron como literales de cadena; podrían usarse para inicializar matrices de caracteres y podrían concatenarse con otros literales de cadenas. GCC 3.4 y posteriores los tratan como variables, como__func__
. En C ++,__FUNCTION__
y__PRETTY_FUNCTION__
siempre han sido variables.
Al menos en el GCC actual, entonces no se puede anteponer L
a __FUNCTION__
, porque es como intentar anteponer L
a una variable. Probablemente haya una versión de VC ++ (como la hubo de GCC) donde esto hubiera funcionado, pero no estás usando esa versión.
Usted lista el error así:
identifier "L__FUNCTION__" is undefined.
Tenga en cuenta que dice " L__FUNCTION__
" no está definido, no " __FUNCTION__
".
No use __FUNCTIONW__
en su código. MS no documentó eso en la página que vinculó, documentaron __FUNCTION__
. Y no necesita ampliar __FUNCTION__
.
ETA: También observo que no está asignando esa cadena a nada ni imprimiéndola de todos modos en f()
.
Solo usa
L(__FUNCTION__ L" : A diagnostic message");
Cuando los literales de cadena adyacentes se combinan, el resultado será una cadena de caracteres amplia si alguno de los componentes fuera.
No hay nada inmediatamente incorrecto con el uso de L
como el nombre de una función ... sin embargo, no tiene sentido. Los buenos identificadores de variables y funciones deben ser descriptivos para ayudar al lector a comprender el código. Pero al compilador no le importa.
Como su función L
envuelve vsprintf, también puede usar:
L(L"%hs : A diagnostic message", __func__);
como __func__
está estandarizado como una cadena estrecha, el especificador de formato %hs
es apropiado.
La regla se encuentra en 2.14.5p13:
En la fase de traducción 6 (2.2), los literales de cadena adyacentes están concatenados. Si ambos literales de cadena tienen el mismo prefijo de codificación , el literal de cadena concatenada resultante tiene ese prefijo de codificación . Si un literal de cadena no tiene prefijo de codificación , se trata como un literal de cadena del mismo prefijo de codificación que el otro operando . Si un token literal de cadena UTF-8 es adyacente a un token literal de cadena ancha, el programa está mal formado. Cualquier otra concatenación se admite de forma condicional con un comportamiento definido por la implementación.