Isso parece ser apenas uma pequena peculiaridade que eu poderia corrigir simplesmente incluindo <cmath>
onde std::floor
é usado, mas ainda assim é estranho e gostaria de saber se alguém sabe o que está acontecendo. Tenho um projeto que consigo compilar em MSVC, GCC e Clang em C++20 e C++23, sem problemas. No Android Studio, consigo compilar em C++20, mas se eu definir o padrão C++20 na minha configuração do CMake, recebo o erro:
erro: nenhum membro chamado 'floor' no namespace 'std'
No lugar onde preciso, incluo <math.h>
, o que funcionou bem para todas as outras configurações de compilação. Acho que o math inclui <cmath>
. De qualquer forma, posso fazer o erro desaparecer incluindo TAMBÉM <cmath>
onde preciso, mas há algum motivo para isso acontecer na compilação do Android com C++23? Tipo, eu já tenho:
#include <math.h>
E com o C++23 no Android Studio eu literalmente tenho que incluir:
#include <cmath>
Para std::floor
ser reconhecido, as funções estão comentadas. Parece estranho.
<cmath>
declara coisas emnamespace std
.<math.h>
declara coisas no namespace global. (O mesmo para todos os outros cabeçalhos da biblioteca padrão C.)Cppreference (e o padrão ) diz que
<cmath>
é permitido declarar coisas adicionais no namespace global, e<math.h>
é permitido declarar coisas adicionais nostd
namespace.std::floor é definido em
cmath
.O Andoid NDK usa
libc++
, enquanto os outros provavelmente usavam MSVC oulibstdc++
. O padrão não restringe quais cabeçalhos serão incluídos transitivamente, isso depende do fornecedor da sua biblioteca padrão, o padrão apenas define o que você deve incluir para garantir ter uma função específica. e casostd::floor
exista emcmath
.math.h é um cabeçalho da biblioteca padrão C. cmath é um cabeçalho da biblioteca padrão C++. Eles definem funções com requisitos idênticos, mas as de C++ estão em
namespace std
. C não possui namespaces nomeados.É comum que os fornecedores desdupliquem isso de alguma forma, geralmente fazendo com que um cabeçalho inclua o outro.
O padrão C++ permite explicitamente (mas não exige) que math.h defina símbolos em
namespace std
, bem como permite que cmath defina símbolos no namespace global.