To be clear, this is not just for convenience. Writing string-type agnostic code (using all these techniques) allows you to write library code, and apps, than can work for either string type just by changing the project settings. So a Windows programmer should never explicitly call a specific function.
That means that, for example, all strings are wrapped like this:
<include tchar.h> // provides string function type wrappers, as well as the _T() macro
const TCHAR* string = _T("my string");
With _UNICODE defined, this resolves to:
const wchar_t* string = L"my string";
Without _UNICODE it resolves to
const char* string = "my string";
So as you can see this compiles correctly in either scenario.