Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

399
Vistas
C vs C ++ ¿por qué esta macro no se expande a una constante?

Estoy usando gcc/g++. El siguiente código se compila bien con gcc -S test.c , sin embargo, con g++ -S test.cpp obtengo un error: requested alignment is not an integer constant . Si observo la salida del preprocesador para ambos, parece idéntico. Entonces, mi pregunta es ¿por qué el preprocesador no evalúa ALIGN_BYTES a la constante 64 en el caso de C++? (Si reemplazo ALIGN_BYTES con la constante 64, funciona bien)

 /* test.c, test.cpp */ #define BITS 512 #define ALIGN_BYTES (BITS / 8) #define ALIGN __attribute__ ((aligned(ALIGN_BYTES))) typedef char* ALIGN char_PT;
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

No es un problema de expansión macro. La macro no se expande a una constante en C o C++, aquí. El preprocesador no hace aritmética, por lo que simplemente genera la expresión 512 / 8 que no es una constante, pero que el compilador definitivamente debería poder reducir a uno.

El preprocesador genera el mismo código para C y C++ aquí, pero GCC (por razones que no entiendo) trata la extensión __attribute__ de manera diferente en los dos idiomas. Realmente no tengo idea de por qué, es probable que haya buenas razones, pero alguien más tendrá que explicarlo.

Si compila C, gcc está feliz con aligned((512 / 8)) , pero si compila C ++ con g++ , se quejará de que 512 / 8 no es una constante. Es correcto, supongo, pero realmente también incorrecto.

Hay otros casos en los que ocurre lo contrario, donde g++ está contento con una no constante, pero gcc no. Si declara una static const int , por ejemplo, puede usarla en __attribute__((aligned(...)) en C++ pero no en C. Una vez más, no puedo explicar por qué. Es una extensión del compilador y GCC puede hacer lo que sea. Y por alguna razón, tratará los dos idiomas de manera diferente aquí.

 /* g++ will complain about this one; gcc will not */ typedef char *__attribute__((aligned((512 / 8)))) char_PT; /* gcc will complain about this one; g++ will not */ static const int A = 16; typedef char *__attribute__((aligned(A))) char_PT2;

Supongo, sin embargo, que como conocemos una versión que funciona con C y otra que funciona con C++, podríamos hacer esto:

 #define BITS 512 #ifdef __cplusplus static const unsigned int ALIGN_BYTES = BITS / 8; #define ALIGN __attribute__((aligned(ALIGN_BYTES))) #else /* C */ #define ALIGN_BYTES (BITS / 8) #define ALIGN __attribute__((aligned(ALIGN_BYTES))) #endif typedef char *ALIGN char_PT;
over 4 years ago · Santiago Trujillo Denunciar

0

Como sugirió @Deduplicator, __attribute__ es una extensión gcc. El uso de lo siguiente solucionó el problema.

 #ifdef __cplusplus #define ALIGN alignas(ALIGN_BYTES) #else #define ALIGN __attribute__ ((aligned(ALIGN_BYTES))) #endif
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda