LoginSignup
9

More than 1 year has passed since last update.

Windows API AとWどちらがお得?

Last updated at Posted at 2021-12-29

Windows API とは

その名の通り、Windows上で動作するアプリケーションにとって、Windowsの各機能にアクセスするための接点(インターフェース)です。
pythonやJavaなどOS/プロセッサに影響されない上級言語からはあまり意識されませんが、C/C++では直接扱う事が少なくないです。

AとW結局どちらがお得かという話は結論まで飛んでください。
以下、小噺です。

ばかめ、それは残像(マクロ)だ

以下はVisual Studio 2019で適当にWindows APIを使って見たものです。
スクリーンショット 2021-12-29 085013.png
GetTickCount64CopyFileは両方ともWindows APIっぽいですが、強調の色が違いますね。つまり、同じものではないということです。
それぞれの定義を見てみましょう。

sysinfoapi.h
WINBASEAPI
ULONGLONG
WINAPI
GetTickCount64(
    VOID
    );
WinBase.h
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でしたが、CopyFileCopyFileWまたはCopyFileAが割り当てられるマクロだったのです。

切り替わる仕組み

UNICODEが定義されているか否かでどちらがCopyFileとなるかが決まります。
Visual Studioでは文字セットの項目からUnicode文字を選択するとUNICODEが定義されます。
スクリーンショット 2021-12-29 094815.png

AとWの違い

Aはマルチバイト文字を扱い、Wはユニコード文字を扱います。
charはサイズが1byteであり、wchar_tは2byteです。
charでも表現に2byteが必要な日本語などを扱う事はできますが、外や川と行った環境依存文字を扱う事ができません。
よって、日本でお仕事をするなら、Wを使用する事が求められます。

結論

「いやいや、日本語環境なんて扱うことなんてないですから。私はサイズもコンパクトなAの方が賢いと思います」という方がいるかもしれません。
しかし、私個人の意見ではWを使った方が良いと考えています。
その理由はA関数の中身にあります。
スクリーンショット 2021-12-29 101033.png
上図はCopyFileAの中身です。(Windows10 20H2)
WindowsさんもWをスタンダードとしているようで、Aを呼ぶとUnicode変換を行った上で、CopyFileWに投げています。
よって、オーバーヘッドが発生してしまうため、初めからWの関数を使用する事をおススメします。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9