I was looking at the changes in C23, and found this in Annex M of the C23 draft:
added @ (U+0040, COMMERCIAL AT), $ (U+0024, DOLLAR SIGN), and ` (U+0060, GRAVE ACCENT, "Backtick") into the source and execution character set;
What is difference between "source character set" and "execution character set"? Are $
, @
, and `
allowed in identifiers in C23?
There is a straight-forward explanation in C23 (and older) 5.2.1 where the terms are formally defined:
Two sets of characters and their associated collating sequences shall be defined: the set in which source files are written (the source character set), and the set interpreted in the execution environment (the execution character set). Each set is further divided into a basic character set, whose contents are given by this subclause, and a set of three or more locale-specific members (which are not members of the basic character set) called extended characters.
Where the basic character set is basically ASCII/UTF-8.
C23 added a subchapter 5.2.1.1 allowing the basic character set to contain multibyte characters, including the ones you mention.
The source character set may contain multibyte characters, used to represent members of the extended character set. The execution character set may also contain multibyte characters, which need not have the same encoding as for the source character set. For both character sets, the following shall hold:
ā The basic character set,
@
(U+0040 Commercial At),$
(U+0024 Dollar Sign), andā
[SIC] (U+0060 Grave Accent, "Backtick") shall be present and each character shall be encoded as a single byte.
...
My take is that 5.2.1.1 is optional/implementation-defined, given the "may".