[英]C string type definition
我只是想寫一個像字符串類似的字符串:
string s;
我想這樣做:
#define string char *
然后例如在main函數中我只需要寫string s;
如果我鍵入不同的變量名稱,那么它不起作用。
我如何改進定義,或者如果這樣做的話,我怎么能用“typedef”來完成這項工作。 或者有更好的方法來制作變量類型的字符串嗎?
我在搜索,但我想我找不到答案。
你不能在C中創建string類型的變量,因為“string”不是一個類型。
根據定義,“字符串”是“由第一個空字符終止並包括第一個空字符的連續字符序列”。 它不是數據類型,而是數據格式。
char
數組可能包含一個字符串。 char*
可以指向一個字符串。 它們都不是字符串。
如果您願意,可以定義
typedef char *string; /* not recommended */
但這是誤導,因為我提到的char*
類型的變量不是字符串。
最好的做法是直接使用char*
。 這清楚表明你的變量是一個指針。 它也與標准庫的定義方式一致; 例如, strlen
函數聲明為:
size_t strlen(const char *s);
它也與大多數有經驗的C程序員編寫處理字符串的代碼的方式一致。
由於C處理數組的方式(或多或少作為二等公民),數組(包括包含字符串的數組)通常通過指向其元素的指針進行操作。 我們可以使用指針算法遍歷數組。 假裝指針是數組,或者它是一個字符串,是誘人的,似乎可以使代碼更容易理解,但從長遠來看,它只會引起混淆。
像宏的方法
#define string char*
甚至比typedef
更糟糕。 宏被擴展為令牌序列; 處理器不知道C聲明的語法。 所以鑒於上面的定義,這個:
string x, y;
擴展到
char* x, y;
它將x
定義為char*
,將y
定義為char
。 如果你需要一個類型的名字, typedef
幾乎總是比#define
。
您必須了解預處理器是什么。 至於你的問題,正確的解決方案是
typedef char *string;
如果你想使用預處理器刪除半冒號和這樣的s
#define string char *
在第二種情況下,預處理器將使用char *
替換每個string
出現,因此如果您聲明
string x, y;
它會擴展到
char *x, y;
其中x
如果指向char
和y
的指針只是一個char
,這是誤導性的,應該避免。
還有一件事,當在C中工作時,隱藏一些變量是指針的事實絕不是一個好主意,所以就像這樣
typedef SomeType *SomeTypeName;
其中SomeType
可以是任何類型,通常是一個壞主意,你可以做一些我已經看到的澄清這一點的東西,你可以將P
附加到SomeType
,就像這樣
typedef SomeType *SomeTypeP;
但我個人更喜歡*
到任何這些typedef
別。 string
是一個C ++關鍵字。 如果涉及到C ++,它不僅會引起問題,更重要的是,它會引起混淆並隱藏你正在處理指針的事實。
更新:合適的人,這不是關鍵字。 但是,如果你using namespace std;
許多人using namespace std;
在您的代碼中, string
是標准庫中的C ++類。
我想說的是,為char *
創建一個別名並不常見,它可能會讓看到你代碼的其他人感到困惑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.