忽略它是如何令人厭惡和不安的,下面保證是安全的嗎?如果不是,爲什麼?是否將const char數組強制轉換爲頭中的整數總是安全的?
//.h
struct foo
{
const static intptr_t KEY = (intptr_t) "VALUE";
};
//.cpp
void useFoo()
{
const char * value = (const char *) foo::KEY;
printf("%s",value);
}
忽略它是如何令人厭惡和不安的,下面保證是安全的嗎?如果不是,爲什麼?是否將const char數組強制轉換爲頭中的整數總是安全的?
//.h
struct foo
{
const static intptr_t KEY = (intptr_t) "VALUE";
};
//.cpp
void useFoo()
{
const char * value = (const char *) foo::KEY;
printf("%s",value);
}
不僅代碼不能保證安全,代碼也不合格。
"VALUE"
的類型爲char const[6]
,它不能通過static_cast
轉換爲intptr_t
。
我使用了錯誤的類型。如果可能的話,我試圖避免使用C風格的演員。問題的精神在於將字符數組文本的開始地址轉換爲頭中的整數,然後在.cpp中恢復它。 – tgoodhart
保證不編譯。您不能使用static_cast
將指針轉換爲整型或反之。如果它是reinterpret_cast
那麼它會是易碎的至少可以這樣說,因爲編譯器可以進行常量摺疊,並且KEY
可能會變得不唯一。
此外,您應該在您的應用程序中定義靜態成員變量KEY
。
與詹姆斯相同的評論。 – tgoodhart
好奇,你爲什麼要這麼做? – jrok
作爲一個窮人的方式來初始化標頭中的常量靜態字符串。在C++ 0x之前,你只能在頭文件中初始化整型。你可以使用#define,或者你可以初始化.cpp中的字符串。我想知道這是否是另一種達到相同結果的方式。 – tgoodhart