繁体   English   中英

C字符串类型定义

[英]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如果指向chary的指针只是一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM