M_PI dlaczego nie ma w standardzie ?

0

Jest kawałek kodu

#include <iostream>
#include <cmath>


int main(int, char**) {
    std::cout << "Hello, world!\n";
    std::cout << M_PI; // <<<  error: 'M_PI' was not declared in this scope
} 
cmake_minimum_required(VERSION 3.0.0)
project(aaaa VERSION 0.1.0)

set(CMAKE_VERBOSE_MAKEFILE ON CACHE BOOL "ON" FORCE) 

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

add_executable(aaaa main.cpp)

Dlaczego taka fundamentalna stałą wymaga włączenia CMAKE_CXX_EXTENSIONS ? Albo zdefiniowania _USE_MATH_DEFINES ?

math.h:

#if !defined(__STRICT_ANSI__) || defined(_POSIX_C_SOURCE) || defined(_POSIX_SOURCE) || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) || defined(_USE_MATH_DEFINES)
#define M_PI		3.14159265358979323846
#endif
6

Bo tego nie ma w standardzie. Jest popularnym rozszerzeniem, udostępnianym przez chyba wszystkie kompilatory, ale musisz to włączyć, jeśli chcesz.

Albo możesz też użyć pi_v z C++20: https://en.cppreference.com/w/cpp/numeric/constants

0

Świat moich komputerów jeszcze nie dotarł do standardu C++20 wiec do tego rozwiązania jeszcze trochę ;)

Jaka jest definicja "rozszerzenia" w kontekście c++ ?

#define _USE_MATH_DEFINES // for C++
#include <cmath>

Czy to jest użycie rozszerzenia standardu c++ czy po prostu taki nieoficjalny standard jak użyć M_PI ?

3

Jaka jest definicja "rozszerzenia" w kontekście c++ ?

Coś, czego zrobienia standard nie wymusza, ale i nie zabrania. Na przykład GCC wprowadza takie: https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Extensions.html

Czy to jest użycie rozszerzenia standardu c++ czy po prostu taki nieoficjalny standard jak użyć M_PI ?

Nie bardzo rozumiem różnicę… To są rzeczy spoza standardu (czyli stanowią one rozszerzenie tego standardu), i przyjęły się wśród wielu kompilatorów (więc stanowią nieoficjalny standard).

4

Jest jeszcze boost https://www.boost.org/doc/libs/1_68_0/libs/math/doc/html/math_toolkit/tutorial/non_templ.html
boost jest dość częstą zależnością, więc jeśli już go masz w swoim projekcie, to przy okazji można skorzystać z tych stałych.

1 użytkowników online, w tym zalogowanych: 0, gości: 1