/Zc:cmath (Ativar a matemática libc)

A /Zc:cmath opção do compilador substitui a implementação em tempo de execução das funções matemáticas no <math.h> cabeçalho em tempo de execução C e <cmath> no cabeçalho padrão da biblioteca C++ pelo libc do LLVM. Esta implementação fornece resultados corretamente arredondados em todos os modos de arredondamento.

Precisa desta opção para avaliação em tempo de compilação das funções matemáticas padrão da biblioteca C++ que passam constexpr a C++23 ou posteriores.

Esta opção é experimental.

Syntax

/Zc:cmath

Remarks

Precisa da /Zc:cmath opção, juntamente com /std:c++23, para avaliação em tempo de compilação das funções matemáticas que se tornam constexpr em C++23 por proposta P0533R9: constexpr para <cmath> e <cstdlib> e LWG Edição 3834: Constexpr em falta para std::intmax_t funções matemáticas em <cinttypes>.

A /Zc:cmath opção está disponível a partir da versão 14.52 do MSVC Build Tools. Está desativado por padrão.

Ativar esta opção pode afetar o desempenho e a precisão das funções matemáticas declaradas em <math.h> e <cmath>.

Quando usa /Zc:cmath, o conjunto de ferramentas C++ liga-se automaticamente a libvcmath-mt.lib ou libvcmath-md.lib quando chama funções matemáticas a partir de um cabeçalho de biblioteca padrão. Estas bibliotecas estão ligadas estaticamente ao binário resultante.

Note

As diretivas de inclusão do sistema usam colchetes angulares, por isso #include <math.h> é reconhecido mas #include "math.h" não é.

Esta opção substitui diretivas de inclusão do sistema que incluem <math.h> e <stdlib.h> por diretivas que incluem cabeçalhos padrão de substituição de bibliotecas. A opção afeta <cmath> e <cstdlib> porque incluem <math.h> e <stdlib.h>. Os cabeçalhos de substituição diferem dos respetivos cabeçalhos UCRT das seguintes formas:

  • As definições de funções matemáticas são noexcept, o que entra em conflito com declarações que não noexceptsão . Ver C2382. As possíveis soluções são remover declarações a encaminhar desnecessárias ou acrescentar noexcept a declarações futuras.

  • Funções e definições de macros que não fazem parte do padrão C++ não são fornecidas. Esta exclusão inclui as Constantes Matemáticas, como M_PI. O <numbers> cabeçalho padrão da biblioteca fornece definições conformes das variáveis correspondentes. Para continuar a usar estas constantes matemáticas, inclua <corecrt_math_defines.h>diretamente . _USE_MATH_DEFINES não tem efeito quando usas /Zc:cmath.

Background

Por defeito, o Tempo de Execução Universal C (UCRT) implementa as funções matemáticas declaradas em <math.h> e <cmath>. O Windows mantém e implementa o UCRT, pelo que os resultados das funções matemáticas podem variar consoante a versão do Windows.

Quando ativa /Zc:cmath, o libc do LLVM implementa estas funções matemáticas em bibliotecas estaticamente ligadas nomeadas libvcmath-mt.lib e libvcmath-md.lib. As ferramentas de compilação C++ implementam estas bibliotecas, não o sistema operativo Windows. Como estas funções devolvem resultados corretamente arredondados, os seus resultados são estáveis em todas as versões do sistema operativo e arquiteturas de hardware.

Para definir esta opção de compilador no Visual Studio

  1. Abra a caixa de diálogo Property Pages do projeto. Para obter detalhes, consulte Definir compilador C++ e criar propriedades no Visual Studio.
  2. Selecione a página de propriedades Configuration Properties>C/C++>Command Line .
  3. Adicionar /Zc:cmath às opções adicionais: painel.

Consulte também

/Zc (Conformidade)
/std (Especificar a versão normalizada da língua)
Constantes matemáticas