# CMP0204

Added in version 4.2.

A character set is always defined when targeting the MSVC ABI.

In CMake 4.1 and below, Visual Studio Generators compile sources in with `_MBCS`, `_UNICODE` or `_SBCS` defined due to behavior of Visual Studio itself. The preprocessor definition is not modeled by CMake and is therefore not added by other generators, such as `Ninja`.

CMake 4.2 and above, when targeting the MSVC ABI, prefer to compile sources with `_MBCS` defined by all generators unless another charset preprocessor definition is found (`_UNICODE` or `_SBCS`). This policy provides compatibility with projects that have not been updated to be aware of the definition. Its setting is recorded by each target as it is created, and affects compilation of sources in that target.

The `OLD` behavior for this policy does not model the `_MBCS` preprocessor definition in CMake itself. The `NEW` behavior for this policy adds the `_MBCS` preprocessor definition to sources as a default encoding when targeting the MSVC ABI.

This policy was introduced in CMake version 4.2. It may be set by `cmake_policy()` or `cmake_minimum_required()`. If it is not set, CMake does not warn, and uses `OLD` behavior.

Note

The `OLD` behavior of a policy is `deprecated by definition` and may be removed in a future version of CMake.