Naturally, Microsoft thought that the 'n' version of those functions
weren't secure enough, so they came up with their own non-standard
functions, ending with _s. And, just to be even more annoying about it,
by default, Microsoft elects to throw compiler warnings at you if you
elect to *not* use the _s functions (even if you're using the 'n'
functions). Isn't that nice? You can disable the warnings, but you have
to #define something to make it happen. Someone should have savagely
raped the asshole who came up with the idea to force compiler warnings for
something as non-standard as that.
And, naturally, the call signature for the '_s' version of the functions
differs from the 'n' version.
errno_t strcpy_s( char* strDestination, size_t numberOfElements, const
char* strSource );
A standard 'safe' version of the string copy function exists, but
Microsoft felt the need to make one that's different, and to try and force
everyone to use it. Had they put a compiler warning advising people to
use the 'n' version of the functions, I would have respected them as being
'helpful'. By trying to annoy everyone into using the '_s' version they
created, I can only think of them as being assholes.