Programım, belirli bir metin olmayan dosya biçimine uygun olarak, bir dosyaya ikili veri yazma görevini yerine getiriyor. Yazmakta olduğum veriler zaten varolan bölümler içinde değil, bunun yerine byte byte ile çalışma zamanında birleştirildiğinden, yerine std::ostream::put()
kullanıyorum. Bunun normal prosedür olduğunu farz ediyorum.Derleyici uyarısı C4309'dan kaçınmak için ortodox bir yol var mı - ikili dosya çıktısı ile "sabit değerin kesilmesi"?
Program gayet iyi çalışıyor. Argümanlar olarak iki basamaklı onaltılık tamsayı ile hem std::stringstream::put()
hem de std::ofstream::put()
kullanır. Ancak, put()
argümanı 0x7f'den büyük olduğunda, C4309'un derleyici uyarısını "VC++ 2010'da" ("VC++ 2010'da") olarak alırım. Açıkçası, derleyici bir signed char
bekleniyor ve sabit aralık dışı. Ama herhangi bir kesilmenin gerçekte olduğunu düşünmüyorum; Bayt, olması gerektiği gibi yazılır.
Derleyici uyarıları, normal ve kabul edilen bir şekilde bir şey yapmadığımı düşünmemi sağlıyor. Tanımladığım durumun ortak olması gerekiyor. gibi bir derleyici uyarısından kaçınmanın yaygın yolu var mı? Yoksa bu, göz ardı edilmemesi gereken bir anlamsız derleyici uyarısı örneğidir.
Ondan kaçınmanın iki yolunu düşünmüştüm. Her aramada mystream.put(char(0xa4))
gibi sözdizimini kullanabilirim. Veya std::stringstream
kullanmak yerine std::basic_stringstream< unsigned char >
kullanabilirdim, ancak bu hile, şablonlu bir tür değil std::ofstream
ile çalışacağını düşünmüyorum. Burada daha iyi bir çözüm bulunmalı gibi hissediyorum, özellikle de ofstream
ikili dosyalar yazmak içindir.
Düşünceleriniz?
--EDIT--
Ah,std::ofstream
templated tip olmama konusunda yanıldı. Bu aslında
std::basic_ofstream<char>
'dur, ancak bu yöntemi denedim ve farkettim ki,
std::ostream
ile tanımlanmış yöntemler ve polimorfik uyumsuzluk nedeniyle işe yaramayacaktı. İşte
bir kod örneği verilmiştir:
stringstream ss;
int a, b;
/* Do stuff */
ss.put(0);
ss.put(0x90 | a); // oddly, no warning here...
ss.put(b); // ...or here
ss.put(0xa4); // C4309
Tahmin ettiğimiz gibi
Sadece bu kadar netiz, sorunuza somut bir kod örneği ekleyebilir misiniz? –
Derleyici yazarların "anlamsız" uyarılar üretmek için zamanları olmadığından eminim. –