2014-10-10 17 views
17

Are dollar-signs allowed in identifiers in C++03?, tanımlayıcılardaki dolar işaretlerine C++ 03'te izin verilmez. GCC, C extension olarak sağlar ve C++ 03 modunda doğru bir teşhis verir. Ancak, C++ 11'de int $ = 0, uyarı vermeden derlenecektir.C++ 11, tanımlayıcılardaki dolar işaretlerine izin veriyor mu?

hiçbir tanısal uygulama tanımlı tanımlayıcılar için gereklidir çünkü $ izin verilebileceğini Bu answer nedenleri:

The answer here is "Maybe": According to §2.11, identifiers may consist of digits and identifier-nondigits, starting with one of the latter. identifier-nondigits are the usual a-z , A-Z and underscore, in addition since C++11 they include universal-character-names (e.g. \uBEAF , \UC0FFEE32), and other implementation-defined characters. So it is implementation defined if using $ in an identifier is allowed. VC10 and up supports that, maybe earlier versions, too. It even supports identifiers like こんばんわ .

But: I wouldn't use them. Make identifiers as readable and portable as possible. $ is implementation defined and thus not portable.

Bu dil de C++ 03 standardına mevcuttur, bu yüzden bu bulmuyorum çok inandırıcı bir argüman olmak.

§2.10/2

In addition, some identifiers are reserved for use by C++ implementations and standard libraries (17.6.4.3.2) and shall not be used otherwise; no diagnostic is required.

standardında ne değişiklik bir kimlik adı olarak kullanılmak üzere $ verir?

+2

Clang bu konuda uyardı. –

+0

@Shafik Bu [yanıt] (http://stackoverflow.com/a/14595459/3920237), C++ 'nun tanımlayıcılarda "$" olduğunu açıkça söyleyen eski gcc belgelerine bağlanmasıyla yeterince kafa karıştırıcı. Bunu [önişlemci seçenekleri] 'ne taşıdılar (https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html # Preprocessor-Options) tek tanımla 'accept‘ $ 'identifiers.' –

+0

Tarihsel olarak DEC, tüm sistem işlevlerini ve kütüphane işlev adlarını tüm dahili işlevlerinde $$ ile birlikte $ olarak kullandı. Tüm DEC derleyicileri ya $ sembol isimleri ya da haritalama için pragmalar sağlayan uzantılar (ADA ile olduğu gibi). – user3344003

cevap

17

Bu, uygulama tanımlı davranıştır, $, tanımlayıcılar için dilbilgisine dahil değildir. C++ 11 yılında tanımlayıcı isimleri için kurallar şunlardır:

  1. O
  2. harflerden oluşan edilebilir bir sayı ile başlayamaz, sayılar, evrensel karakter isimleri çizgi ve uygulama karakterleri
  3. tanımlanmış
  4. bir keyword

izin verilir Uygulama tanımlı karakterler ve birçok derleyici olamaz gcc, clang, Visual Studio ve comment numaralı belgelerde belirtildiği gibi bir uzantı olarak destek görür. DEC C++ compilers. Biz -pedantic-errors bayrağıyla clang kullanarak bu kodu derlemek

identifier: 
    identifier-nondigit   <- Can only start with a non-digit 
    identifier identifier-nondigit <- Next two rules allows for subsequent 
    identifier digit    <- characters to be those outlined in 2 above 
identifier-nondigit: 
    nondigit      <- a-z, A-Z and _ 
    universal-character-name 
    other implementation-defined characters 
[...] 

derlenemeyecektir.Ancak olmaz::

gramer draft C++ standard bölüm 2.11kimlikle kaplıdır, ben ek notlar <- ile başlayan eklendi

ve aşağıdaki hatayı üretir:

3

Sanırım öyle değil. Dolar işareti, standardın E.1 (charname.allowed) ekinde tanımlanan aralıkların hiçbirinde olmayan ASCII 0x24'tür. Ve ne rakam ne de nondigit olmadığı için uygulama tanımlı bir karakter olmalı. Bu nedenle, bunun taşınabilir C++ 11 olmadığını kabul ediyorum. Ayrıca, bir tanımlayıcının, uygulama tarafından izin verilen bir karakterle başlamasına izin verirken, bir tanımlayıcı evrensel bir karakterle başlamayacağını unutmayın.

+1

"Taşınabilir değil" ve "izin verilmez" (kötü biçimlendirilmiş) hem kötü şeylerdir, hem de aynı değildir. Yani bu soruya doğrudan bir cevap değil. – MSalters

+1

Bunun farkındayım. Burada "uygulama tanımlı davranış" için eşanlamlı olarak "taşınabilir değil" kullanılır. – dom0

İlgili konular