Why "std::sin" instead of "sin"?


#1

In “Tutorial: Sine synthesis”, I see a call to “std::sin” rather than “sin”. What’s the purpose of spelling out the namespace for the C++ Standard Library here?

When I replace “std::sin” with “sin” (in “examples/audio plugin demo”), it still compiles and works in my environment.

When I want to call C++ Standard Library functions in general, how do I decide when to prepend “std::” to their names?


#2

Well there’s also dsp::FastMathApproximations::sin in the API. That’s relatively new.

In general you should always use the prefix std:: when making calls from the standard library. In C++, it’s useful to make calls from a namespace explicit, except when making many, many references to one namespace (for example, in JuceHeader.h you should see using namespace juce;). With calls to math functions it’s usually just style, but with a function like sin it’s not uncommon for a faster implementation to be used. That’s probably the first thing you should replace if you mean to improve the tutorial code.


#3

Thanks. I had not realized that, so I mistakenly thought this was a JUCE-specific issue.


#4

The main reason in case of sin is because there is the C++ std::sin which have overloading for float and double and C standard library sin which take only a double (you need to use sinf for float)


#5

Thanks, I appreciate it. I used to know my way around c++, but coming back to it after a 20-year break, I’ve forgotten some, and they’ve made some substantial additions to the language. I did not mean to bring a general c++ question to this forum, though; I thought this was a JUCE specific issue because Visual Studio 2017 led me to JUCE source code when I asked where std::sin was declared.


#6

But beware of simply replacing std:sin() with dsp::FastMathApproximations::sin() since the latter expects the argument to be between -pi and pi.

We toyed with a number ideas for that tutorial (for example, using a look-up table) deciding to use std::sin() and keep it consistent with the other similar example code. When profiling some naive lookup table techniques this was slower that simply calling std::sin() and not manually wrapping the phase (of course, avoiding a branch or an additional function call).


#7

Yes in general using std::function instead of function is convenient because you don’t have to specify whether you need a float or a double thanks to the overloading of the std variant. I think it’s even more important for macOS development, where I got some headaches figuring out that “abs” is for integers only, and that for float you need either fabsf (ouch) or std::abs (yeah !)


#8

More precisely, in should not be in the global namespace, that’s probably because there is a #include <math.h>, which is the C header.
In the proper C++ header (cmath), you only get std::sin.