Windows API とは
その名の通り、Windows上で動作するアプリケーションにとって、Windowsの各機能にアクセスするための接点(インターフェース)です。
pythonやJavaなどOS/プロセッサに影響されない上級言語からはあまり意識されませんが、C/C++では直接扱う事が少なくないです。
AとW結局どちらがお得かという話は結論まで飛んでください。
以下、小噺です。
ばかめ、それは残像(マクロ)だ
以下はVisual Studio 2019で適当にWindows APIを使って見たものです。
GetTickCount64
とCopyFile
は両方ともWindows APIっぽいですが、強調の色が違いますね。つまり、同じものではないということです。
それぞれの定義を見てみましょう。
WINBASEAPI
ULONGLONG
WINAPI
GetTickCount64(
VOID
);
WINBASEAPI
BOOL
WINAPI
CopyFileA(
_In_ LPCSTR lpExistingFileName,
_In_ LPCSTR lpNewFileName,
_In_ BOOL bFailIfExists
);
WINBASEAPI
BOOL
WINAPI
CopyFileW(
_In_ LPCWSTR lpExistingFileName,
_In_ LPCWSTR lpNewFileName,
_In_ BOOL bFailIfExists
);
#ifdef UNICODE
#define CopyFile CopyFileW
#else
#define CopyFile CopyFileA
#endif // !UNICODE
ということで、GetTicCount64
は純粋なWindows APIでしたが、CopyFile
はCopyFileW
またはCopyFileA
が割り当てられるマクロだったのです。
切り替わる仕組み
UNICODE
が定義されているか否かでどちらがCopyFile
となるかが決まります。
Visual Studioでは文字セットの項目からUnicode文字を選択するとUNICODE
が定義されます。
AとWの違い
Aはマルチバイト文字を扱い、Wはユニコード文字を扱います。
char
はサイズが1byteであり、wchar_t
は2byteです。
char
でも表現に2byteが必要な日本語などを扱う事はできますが、鷗
外や川﨑
と行った環境依存文字を扱う事ができません。
よって、日本でお仕事をするなら、Wを使用する事が求められます。
結論
「いやいや、日本語環境なんて扱うことなんてないですから。私はサイズもコンパクトなAの方が賢いと思います」という方がいるかもしれません。
しかし、私個人の意見ではWを使った方が良いと考えています。
その理由はA関数の中身にあります。
上図はCopyFileA
の中身です。(Windows10 20H2)
WindowsさんもWをスタンダードとしているようで、Aを呼ぶとUnicode変換を行った上で、CopyFileW
に投げています。
よって、オーバーヘッドが発生してしまうため、初めからWの関数を使用する事をおススメします。