2010-06-23 10 views
5

Empecé a obtener el error "error C2059: error de sintaxis: 'argumento predeterminado'" para una línea de código que declaró una función con un argumento de cadena que recibió un parámetro predeterminado . Esto fue, obviamente, un poco frustrante, ya que el mensaje de error no fue muy esclarecedor (¡sé que es un 'argumento predeterminado'!), Y la declaración exacta funcionaría en otro lugar.Error de sintaxis sutil en el parámetro predeterminado no capturado por el compilador

Después de cambiar un poco la declaración, encontré que su posición en la clase contenedora tenía un efecto. Al reducirlo, descubrí que estaba declarando una función diferente de forma errónea, incluyendo un punto y coma después de uno de sus parámetros predeterminados. El compilador parecía perfectamente bien con eso, lo cual parecía un poco extraño. Investigué un poco más, y se acercó con el siguiente caso de prueba para tratar de averiguar la esencia de lo que estaba pasando:

enum TestEnum1 
{ 
    TEST_ONE 
}; 
class TestClass 
{ 
public: 
    enum TestEnum2 
    { 
     TEST_TWO, 
     TEST_THREE, 
     TEST_FOUR 
    }; 
    void Func1(int iParm = TEST_ONE;); // additional semicolon here 
    void Func2(std::string strParm = ""); 
}; 

Como el código anterior se destaca, Func2 producirá el error de compilación que he mencionado anteriormente. Si muevo Func2 arriba de Func1, entonces todo compila bien.

Si cambio el parámetro predeterminado en Func1 a un número explícito o uso una enumeración declarada dentro de TestClass, entonces obtengo un error de sintaxis esperado para esa línea.

Así que, esencialmente, lo extraño parece ser que no se si fijo el valor de un parámetro por defecto para una enumeración definida directamente en la clase actual y soy un poco demasiado por punto y coma feliz, el compilador ignorará el error de sintaxis, hasta que otra cosa aparentemente no relacionada finalmente cause que el analizador fallezca de una manera muy inescrutable.

¿Me falta algo por completo? ¿Es este comportamiento esperado? Tengo dudas en llamarlo un error en el compilador, ciertamente, pero esto no parece correcto. Si solo estoy malinterpretando algo sobre el estándar, entonces me gustaría saber dónde estoy equivocado.

+0

Obtengo el mismo error de compilación si Func1 está por encima o por debajo de Func2, usando gcc 3.4.4. – Beta

+0

Eso es bueno saber. No tengo una manera fácil de probar diferentes compiladores configurados en este momento. –

Respuesta

1

De acuerdo con @tlayton. Habiendo incursionado un poco en analizadores sintácticos, puedo dar fe de que generar buenos mensajes de error para los errores de sintaxis que confunden el sentido del alcance del analizador puede ser muy difícil de hacer.

Este caso particular es, sin embargo, cerca de un defecto.La ironía es que en VS2010, el compilador todavía genera el mismo mensaje de error pésimo pero el analizador de IntelliSense en realidad lo atrapa:

3 IntelliSense: expected a ')' c:\projects\cpptemp14\cpptemp14.cpp 20 36 cpptemp14 

Eso es borked. Puede informarlo en connect.microsoft.com. Avíseme si no desea tomarse el tiempo, lo reportaré (deber MVP).

+0

Sí, parte de lo que me llevó a la verdadera fuente de mi problema fue que la función con el punto y coma itinerante tenía una pequeña marca roja en uno de sus paréntesis como resultado de un problema de intellisense. En cuanto a informarlo, veré lo que puedo hacer, aunque supongo que volveré si tengo problemas, nunca intenté informar algo así antes. –

+0

Ok, después de enviarlo, pudieron reproducirlo, así que supongo que se agregará a una pila de errores en alguna parte. –

+0

Comentarios está aquí: https://connect.microsoft.com/VisualStudio/feedback/details/575806/syntax-error-in-default-function-parameter-not-caught-by-compiler-in-some-cases –

2

Diría que esto no es exactamente un error en el compilador, sino que la incapacidad del compilador para analizar el código se expresa de forma inesperada.

Cuando el compilador golpea ese punto y coma errante, cree que sabe algo sobre el código que no se supone que es cierto. El compilador no ve nada que contradiga esa creencia hasta que alcanza el argumento predeterminado de la segunda función, que aparentemente no encaja con el estado en el que creía que estaba el código sintácticamente. Llama el error allí porque es donde vio el problema, pero no garantiza que ahí es donde reside el problema con el código.

Esto es algo que a menudo veo que incluye llaves, paréntesis u otros corchetes de delimitación mal colocados o faltantes. El compilador cree que todo está bien hasta que llega al final de un bloque de código y se da cuenta de que no hay el mismo número de corchetes izquierdos y derechos, por lo que llama el error allí. Realmente no puede decir dónde se suponía que iba a ir el soporte faltante.

Como este comportamiento depende del proceso de análisis exacto utilizado, depende del compilador. Sin embargo, aunque esto a menudo puede cambiar el tipo de error que se llama y dónde, generalmente será un error de algún tipo en cada compilador.

+0

¿No es esa línea específica malformada? Estás dando mucha latitud a la palabra "error". – Stephen

+0

Lo afortunado de la falta de llaves y puntos y comas es que conducen a decenas de errores, incluso si parecen no tener relación. Creo que es solo el falso positivo de que no se da cuenta de mi error de sintaxis que encontré extraño. –

Cuestiones relacionadas