Is _ (single underscore) a valid C++ variable name?
Asked Answered
E

6

27

With gcc 4.7.2 this compiles just fine for me:

int main()
{
  int _ = 1;
  return 0;
}

Can I expect this to compile in general? I've read the answers about underscores as prefixes. But what if the underscore isn't prefixing anything?

Elapse answered 5/9, 2013 at 22:28 Comment(0)
K
24

Yes, from The C++ Programming Language, 4th Edition:

A name (identifier) consists of a sequence of letters and digits. The first character must be a letter. The underscore character, _, is considered a letter.

Klug answered 5/9, 2013 at 22:32 Comment(1)
You can infer from that quote that the answer is "yes", but it would be nice to say so.Natal
D
17

According to Stroustrup (3rd edition, section 4.9.3), an identifier consists of a sequence of letters and digits. The first character must be a letter. The underscore character is considered a letter.

So, yes, it should be portable.

Duran answered 5/9, 2013 at 22:32 Comment(2)
Beat you by 2 seconds!Klug
Also, in the C++ standard (2.11).Perfective
N
14

Yes, _ is a valid identifier, since it meets the syntax requirements. Basically, an identifier consists of an underscore or letter, followed by zero or more other characters that can be underscores, letters or digits. (As of C++ 2011, identifiers can also contain universal character names and other implementation-defined characters, but that's not relevant to your question.)

But it's probably not one that you should use in your own code, unless you're very careful.

As this answer says, quoting the 2003 C++ standard:

Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace.

Your _ variable isn't in the global namespace, so you're safe in this case, but it's a good idea to avoid defining any identifiers starting with an underscore.

Also, I believe GNU gettext (which provides support for localized messages) uses the name _ for its own purposes. (It was arguably a bad idea for GNU gettext do to this, but it was a convenient choice.)

Natal answered 5/9, 2013 at 22:53 Comment(2)
Doesn't this (GNU gettext convention) conflict with C++ naming rules? I read that global names beginning with an underscore are forbidden?Ardrey
@Wolf: They're not exactly forbidden, but they're reserved. Yes, I believe gettext's use of _ violates both C and C++ requirements -- but as long as the implementation doesn't actually use _, it's not likely to cause actual problems.Natal
J
3

Yes. a single _ will be accepted as variable or any identifier/namespace name! E.g. google mock uses this.

Jesus answered 5/9, 2013 at 22:33 Comment(1)
Boost.MPL too. boost.org/doc/libs/1_54_0/libs/mpl/doc/refmanual/…Octaviaoctavian
D
0

Yeah it's a valid prefix. Running

#include <iostream>

using namespace std;

int main()
{
char* _ = "Hello World";
cout << _ << endl; 
return 0;
}

prints out "Hello World" as expected. It's not a very helpful varible name but it is valid

Detrain answered 5/9, 2013 at 22:35 Comment(2)
Compiling or running it does not ensure standards-compliance or portability.Duran
@WayneMcGee: Unless you either have access to LOTS of compilers [although it is likely to either fail or succeed in some compiler when the opposite should happen], or ask the compiler to be strict about standards [and again, strictness may be subject to compiler bugs].Lifesize
F
0

But why having this weird name '_' for a variable? Does it mean you do not want no one access it again or something? Saw code looks like:

for (auto _ : <range based container>) {
    // some code that does not use '_' at all
}
Frankiefrankincense answered 5/1, 2021 at 21:57 Comment(3)
(this is probably better as a "comment" than an "answer"; to reduce risk of downvotes). I sometimes use _ to indicate output arguments that I don't intend to use. string first_name; {string _; get_first_and_last_name(first_name,_); } Elapse
It's a python convention.Dishwasher
It can be used to emulate Pascal's "with" syntax (see for example https://mcmap.net/q/495222/-does-c-have-quot-with-quot-keyword-like-pascal).Connection

© 2022 - 2024 — McMap. All rights reserved.