SORU
13 Ocak 2014, PAZARTESİ


'R özel s ve C ön işlemci L?

Visual Studio 2013 işleyişi ile aşağıdaki kodu çalıştırdım. Çıktı, beni şaşırttı.

Hello.cpp içeriği:

#define A(j) #j

A(A?)
A(B?)
A(C?)
A(D?)
A(E?)
A(F?)
A(G?)
A(H?)
A(I?)
A(J?)
A(K?)
A(L?)
A(M?)
A(N?)
A(O?)
A(P?)
A(Q?)
A(R?)
A(S?)
A(T?)
A(U?)
A(V?)
A(W?)
A(X?)
A(Y?)
A(Z?)

Komut:

cl /P hello.cpp

Merhaba.ben de içerir:

#line 1 "hello.cpp"



"A?"
"B?"
"C?"
"D?"
"E?"
"F?"
"G?"
"H?"
"I?"
"J?"
"K?"
"L"
"M?"
"N?"
"O?"
"P?"
"Q?"
"R"
"S?"
"T?"
"U?"
"V?"
"W?"
"X?"
"Y?"
"Z?"

Telefon çalışıyor(L?iken koştum sonuçlandı p:S),": S" Bu benim için iyi değil. Lp

Bu doğru, iyi tanımlanmış bir C ? C L ve R hakkında özel nedir ? Eğer dosya varsa .c uzantısı, L ve R aynı alfabenin geri kalanı için tedavi edilir. Bu C 11 ile ilgilidir? MSVS eski sürümleri özel bir şekilde L ve R basma beri yeni bir özellik olmalı.

Ve ben bu özel şekilde L ve R Tedavi MSVS 2013 durdurmak için ne yapabilirim?

CEVAP
13 Ocak 2014, PAZARTESİ


Güncelleme

Hata raporu gibi yinelenen bir güncelleme olan this one: olarak işaretlenmiş

Bu sorun için bir düzeltme derleyici kaynakları kontrol edilmiştir. Düzeltme: Visual C sonraki büyük sürümü olmalıdır .

Özgün

Remyabel belirttiği gibi bu reported bug. Ne gcc ne clang Bu sonuçlar ve stringizing operator # üretmek Visual Studios belgelere göre, bu aşağıdaki değiştirmeler (vurgu ileriye dönük benim):

Boşluk ilk gerçek argümanın son belirteç aşağıdaki gerçek argümanın ve token önceki göz ardı edilir. Gerçek bağımsız belirteçleri arasında herhangi bir boşluk elde edilen dize içinde tek bir beyaz boşluk azalır. Eğer bir yorum gerçek argümanın iki belirteçleri arasında oluşur, bu nedenle, tek bir beyaz boşluk azalır. Sonuçta elde edilen dize otomatik olarak yalnızca boşluk ile ayrılır bitişik bir dize hazır bilgi ile birleştirilmiş.

Ayrıca, eğer bir karakter içerdiği argüman gerektirir bir çıkış sırası geldiğinde kullanılan bir dize (örneğin, tırnak işareti (") veya ters eğik çizgi () karakteri), gerekli kaçış eğik çizgi otomatik olarak eklenen önce karakter.

9 ** C draft standard bölümüne karşılık gelir# Operatördiyor ki:

Eğer yedek liste, bir parametredir hemen önce a # önişleme token, iki yerine tek bir karakter dize önişleme belirteci içeren yazım önişleme token dizisi için karşılık gelen bağımsız değişken. Kavgan ön belirteçleri arasındaki boşluk her geçtiği karakter dize içinde tek bir boşluk karakteri olur. İlk önce ön boşluk değişkeni silinir token ve son ön sonra token oluşan. Aksi takdirde, orijinal yazım her önişleme belirteç aslını muhafaza karakteri dize dışında özel kullanım için Üretim yazım dize hazır bilgi ve karakter rakamları: bir \ karakteri eklenir önce her "ve \ karakter hazır bilgi karakteri veya dize (dahil sınırlayan" karakter).

Saygı ile R L ilişkilendiren tek şeyC 11string literals ile özel bir anlamı olması ama bunun etkisi nasıl görmüyorum.

Ayrıca L\ R\ de aynı sorun üretmek gibi görünüyor.

Bir belge yaparlar non-compliant issue ve diyor ki:

Visual C doğru davranmaz # (stringize) operatörü kaçış dizileri içeren dizeleri ile kullanılır. Bu durumda, derleyici Derleyici Hata C2017 oluşturur.

bu durumda olan kapsamaz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andrew_Huang

    Andrew_Huang

    10 ŞUBAT 2006
  • DavideoDesign

    DavideoDesig

    24 NİSAN 2006
  • Digital Bounds

    Digital Boun

    19 Temmuz 2013