簡體   English   中英

一種將字符串文字自動轉換為C中的unsigned char *的方法?

[英]A way to automatically cast string literals to `unsigned char*` in C?

我正在為項目使用libxml2,它的一個怪癖是xmlCharunsigned 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_CASTxmlstring.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM