Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

409
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda