Andrés Tomazos
Bajo gcc/g++ 4.9 puedo escribir:
int x __attribute__((unused)) = f();
para indicar que x no se usa intencionalmente.
¿Es posible hacer esto con C++ 11? [[]]
notación de atributo de alguna manera?
Lo intenté:
int x [[unused]] = f();
pero no funciona
(Sí, sé que es un atributo definido por la implementación).
AliciaBytes
si, uso [[gnu::unused]]
como ya se dijo unused
no es parte del atributos estándar especificado por la norma.
El estándar también permite la implementación de atributos definidos como el __attribute__
y __declspec
que se utilizarán con la nueva sintaxis. Si un compilador no reconoce un atributo (un atributo gcc al compilar en MSVC como ejemplo), simplemente se ignorará. (probablemente con una advertencia)
Para gcc puede usar el prefijo gnu y la sintaxis de atributos de C++11: [[gnu::unused]]
en lugar de __attribute__((unused))
lo mismo debería aplicarse a los otros atributos de gcc también.
-
Genial, con este gcc permite la sintaxis: X x [[gnu::unused]]= y;
– Eliano
20 sep 2018 a las 18:07
alan kazbekov
Hay [[maybe_unused]]
atributo en C++17. Está implementado en GCC 7, consulte Compatibilidad con estándares C++ en GCC .
Ejemplo de Propuesta P0212R1:
[[maybe_unused]] void f([[maybe_unused]] bool thing1,
[[maybe_unused]] bool thing2) {
[[maybe_unused]] bool b = thing1 && thing2;
assert(b);
}
Mateusz Grzejek
Eso a lo que te refieres se conoce como especificadores de atributos. Es un intento de estandarizar varios especificadores dependientes de la plataforma:
__attribute__
en caso de CCG / CCI (Linux)__declspec
en MSVC / ICC (ventanas)
Como puede ver en el enlace del documento adjunto, los únicos especificadores admitidos en C++ 11 son:
[[noreturn]]
[[carries_dependency]]
y en C++14:
[[deprecated]]
(también compatible como:[[deprecated("reason")]]
)
C++ 17 es la versión que presenta la característica requerida:
[[maybe_unused]]
(cppreference.com)
Ejemplo del enlace:
#include <cassert>
[[maybe_unused]] void f([[maybe_unused]] bool thing1,
[[maybe_unused]] bool thing2)
{
[[maybe_unused]] bool b = thing1 && thing2;
assert(b); // in release mode, assert is compiled out, and b is unused
// no warning because it is declared [[maybe_unused]]
} // parameters thing1 and thing2 are not used, no warning
Entonces la respuesta es: no, no es posible, usando solo funciones de C++ 11 – la versión de C++ requerida para obtener esto de forma portátil es C++ 17.
si no te interesa solo en soluciones portátiles, podría haber una manera. El estándar C++ no limita esta lista:
Solo los siguientes atributos están definidos por el estándar C++. Todos los demás atributos son específicos de la implementación.
Varios compiladores pueden admitir algunos especificadores no estándar. Por ejemplo, puedes leer esta página para averiguar que Clang admite:
[[gnu::unused]]
Quizás su versión de GCC también admita este especificador. Esta página contiene un informe de error que hace referencia a la compatibilidad con atributos generalizados. [[gnu::unused]]
también se menciona.
-
A Ben Deane se le ocurrió una solución C++ 11 interesante que agregué como respuesta aquí, obviamente se basa en el optimizador, pero todavía no he visto uno que no haga lo correcto.
– Shafik Yaghmour
10 de agosto de 2015 a las 2:20
-
@ShafikYaghmour Idea interesante, aunque no creo que sea una buena solución. Puede o no puede optimizarse en tal caso.
unused
atributo es más explícito y predecible. Además, cada plataforma conocida tiene alguna forma deunused
así que lo mejor multiplataforma la solucion seria una#ifdef
y macro común para todas las plataformas: probablemente sea la mejor solución posible (hasta que se estandaricen más atributos).– Mateusz Grzejek
10 de agosto de 2015 a las 2:39
-
Probablemente presentaría un informe de error si no se optimizara correctamente, no estoy seguro de que usaría ese truco, pero vale la pena documentarlo, puede resultar muy útil para otra persona.
– Shafik Yaghmour
10 de agosto de 2015 a las 2:43
-
¿Hay algún cambio para C++17 (C++1z)?
– Macxx
8 de agosto de 2017 a las 12:06
-
La cola de edición está llena, así que no puedo hacer nada, pero el enlace de MSDN actualmente redirige a learn.microsoft.com/en-us/previous-versions/… y debe actualizarse cuando la edición sea posible nuevamente.
– AJM
1 de junio de 2022 a las 16:27
¿Por qué pensarías que funcionaría? ¿Vio alguna especificación de idioma?
– SwiftMango
09/08/2015 a las 23:05
Y no, no funciona. Es solo la extensión gcc. No especificaciones de idioma
– SwiftMango
09/08/2015 a las 23:05
No se ajusta perfectamente a su pregunta como respuesta, pero mi comentario a continuación puede interesarle.
– Shafik Yaghmour
10 de agosto de 2015 a las 2:21