HeadlinesBriefing HeadlinesBriefing.com

Seu C não é o C padrão

Hacker News •
×

Esta é uma lista incompleta de incompatibilidades entre o C conforme escrito no padrão e o C que existe na prática para quem usa gcc ou clang com glibc ou musl.

Por padrão, gcc e clang reconhecem a palavra-chave asm como uma extensão. No C padrão, asm é um identificador válido não reservado, portanto um código em conformidade com o padrão pode não compilar com as configurações padrão. Os compiladores não são conformes por padrão, e o padrão poderia tornar asm uma palavra reservada, como faz o C++, mas não o fez.

O padrão exige que FLT_ROUNDS reflita as mudanças em tempo de execução do modo de arredondamento feitas por meio de fesetround em <fenv.h>. No entanto, o gcc sempre define FLT_ROUNDS como 1 (arredondar para o mais próximo), independentemente do modo de arredondamento em tempo de execução. O clang oferece uma função embutida, __builtin_flt_rounds(), mas o gcc não.

O padrão C especifica pragmas de ponto flutuante, adicionados no C99 e no C23, para controlar o comportamento aritmético. Mais de 27 anos depois do C99, o gcc ainda os ignora todos como operações nulas, e o clang suporta apenas os pragmas do C99. Parte da funcionalidade pode ser replicada com opções de linha de comando, mas elas se aplicam a toda a unidade de tradução, e não a funções ou blocos individuais.

O padrão exige que os qualificadores em tipos de retorno de função sejam descartados. O clang, porém, os trata como significativos, de modo que declarar int f(); e const int f(); juntos gera um erro de tipos conflitantes, embora as duas declarações devessem ser idênticas.

Fonte: Hacker News · Resumido por HeadlinesBriefing