2010-03-03 8 views
14

Ben yalnızca salt okunur erişilecek bir dize döndürmek için bir işlev gerekir. Dize içeriği derleme zamanında bilinir, böylece bir dize değişmezini kullanırım.Bir dize hazır adresi, güvenli ve taşınabilir bir işlevden mi alıyor?

std::string myFunction() 
{ 
    return "string"; 
} 

veya iade const char*:

const char* myFunction() 
{ 
    return "string"; 
} 

bu senaryoda ikinci alternatif güvenli ve taşınabilir mi

Ben std::string gibi bir şey dönebilirsiniz?

cevap

12

bu senaryoda ikinci alternatif güvenli ve taşınabilir mi?

Evet! dizgilerin depolama tahsisi statik ve onlar uygulamanın ömrü boyunca sürer.

+0

size ispat için bir referans kaynağı olabilir mi? –

3

Evet. (Küresel bir veri yapısında bu işaretçiyi saklamak farklı değildir).

10

Evet! Ama bu Olası bir yanlış anlama dikkat:

char * myFunc() { 
    return "Constant string?"; 
} 

Evet, bir olmayan constchar * için hazır bilgi bir dize dönüştürebilirsiniz! Bu, daha sonra bu char *'un içeriğini değiştirmeye çalışarak dünyayı kırmanızı sağlayacaktır. Bu "özellik" eski nedenlerden dolayı var - dize hazırlıkları const'dan daha eski ve başlangıçta

g ++, varsayılan modda bile minnettar bir uyarı veriyor. VC++, hevesle bir uyarı atar mı bilmiyorum.

+0

@Philip: Bunu VS2008'de denedim ve hiçbir uyarı almadım. Bunun için bir uyarı olup olmadığını bilmiyorum. Belki var ve varsayılan olarak kapalıdır çünkü tedarik edilen üstbilgiler çok fazla uyarıyı tetikleyecektir ;-) – quamrana

İlgili konular