Path: csiph.com!eternal-september.org!feeder.eternal-september.org!reader01.eternal-september.org!.POSTED!not-for-mail From: Keith Thompson Newsgroups: comp.lang.c++ Subject: Re: An example: code to list exports of a Windows DLL. Date: Mon, 19 Aug 2019 18:31:54 -0700 Organization: None to speak of Lines: 60 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Injection-Info: reader02.eternal-september.org; posting-host="eda0362a42d89c1a502f45f546af142c"; logging-data="16470"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19hHeVVOF0qjswHBztb3tMu" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux) Cancel-Lock: sha1:SY6sFWyiU3MquaUPhogdGcDY0YE= sha1:Qr1zK23h/3+4xosE72V13nMMEg8= Xref: csiph.com comp.lang.c++:67794 "Alf P. Steinbach" writes: > On 19.08.2019 21:44, Richard wrote: >> "Alf P. Steinbach" spake the secret code >> thusly: >> >>> The $ things in the following code are macros from the specified >>> header-only library on GitHub. >> >> Can you tell me where in the standard it allows for $ to be part of an >> identifier? >> >> I'm looking at 5.10 in N4659 (Draft C++17) and don't see it. > > In the future you might risk that people think you're a total novice, > one who doesn't even know the basics of identifiers in C++. Then I'll risk the same thing. Can you explain where C++17 permits $ in identifiers (or where it permits compilers to permit it)? Earlier editions of the standard, such as C++11, permitted "other implementation-defined characters" in identifiers. This was dropped after Defect Report #1963 pointed out that it was supposedly redundant. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1963 In N4700 (a more recent C++17 draft), identifiers may contain the 52 upper and lower case letters, the 10 decimal digits, underscores, and universal-character-names. Characters not in the basic source character set are mapped to universal-character-names in translation phase 1, so $ will (probably) be mapped to \u0024 . But universal-character-names in identifiers are only allowed by designate characters in certain ranges (Table 2 in 5.10 [lex.name]), and \u0024 is not in any of those ranges. For example, this program prints "42" when I compile and run it with g++, but clang++ rejects it (it warns about the '$' in an identifier and says that "foo" is undeclared on the "std::cout << ..." line). (I used "-std=c++17 -pedantic" for both.) #include int main() { const int foo$bar = 42; std::cout << foo\u0024bar << "\n"; } I believe that both foo$bar and foo\u0024bar violate a diagnosable rule and therefore require a diagnostic from any conforming compiler (which implies that gcc is non-conforming). It's possible that it was intended to permit (but not require) support for $ in identifiers, but that that was overlooked in the response to Defect Report #1963. Perhaps 0024 should be added to Table 2? Or perhaps I'm missing something (always a real possibility). -- Keith Thompson (The_Other_Keith) kst-u@mib.org Will write code for food. void Void(void) { Void(); } /* The recursive call of the void */