![](/img/trans.png)
[英]In C11, string literals as char[], unsigned char[], char* and unsigned char*
[英]A way to automatically cast string literals to `unsigned char*` in C?
我正在為項目使用libxml2,它的一個怪癖是xmlChar
是unsigned char
的typedef,而不僅僅是char
。 據我所知,這對實際執行沒有任何影響,但是使用字符串文字確實很煩人,因為我必須手動將其轉換為const xmlChar*
。 我真正想要的是能夠編寫xmlGetProp(node, "some-property")
而不是xmlGetProp(node, (const xmlChar*)"some-property")
。 它可能看起來很小,但是當其他每個語句都具有(const xmlChar*)
時,它會使代碼變得更加難以閱讀。
有沒有一種方法可以將const char*
強制轉換為const xmlChar*
( const unsigned char*
)而無需手動強制轉換? 或者,是否有我不應該這樣做的原因?
我認為這在C ++中會相當容易,但是我對C感到困惑。
libxml2的限定宏BAD_CAST
在xmlstring.h
:
#define BAD_CAST (xmlChar *)
可以這樣使用:
xmlStrEqual(name, BAD_CAST "xml:lang")
char *
和unsigned char *
很煩人,因為(在2的補碼上)它們都指向同一件事。 即使允許通過這些類型進行別名,C標准也需要進行診斷。 一些編譯器有一個選項可以抑制這種情況的診斷(當您省略強制轉換時)。
您可以編寫一些包裝器:
xmlChar *VxmlGetProp(const xmlNode *node, const char *name)
{
return xmlGetProp(node, (const unsigned char *)name);
}
請注意,我沒有在類型轉換中編寫const xmlChar
,因為如果您稍后將libxml重新配置為對xmlChar
使用寬字符,這將無提示地導致行為中斷。
您甚至可以使用const void *
作為參數類型,以允許您的函數同時使用const char *
和const unsigned char *
。
您的代碼中的另一種選擇(這也增加了抗錯字性)是不使用字符串文字。 而是將它們放在表格中,例如
#define STRING_FOOBAR ((const unsigned char *)"foobar")
然后在您的代碼中使用STRING_FOOBAR
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.