[英]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.