我只是想写一个类似字符串的字符,你可以写:
string s;
我想这样做:
#define string char *
然后例如在main函数中我只需要编写string s;
,如果我输入不同的变量名,那么它就不起作用了。
如何改进定义,或者我如何使用" typedef"对于这份工作,如果做到这一点并不是一个坏习惯。或者是否有更好的方法来制作变量类型的字符串?
我在搜索,但我想我找不到答案。
答案 0 :(得分:7)
你不能在C中创建string类型的变量,因为" string"不是一种类型。
A" 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
。
答案 1 :(得分:3)
您必须了解Preprocessor是什么。至于你的问题,正确的解决方案是
typedef char *string;
如果你想使用预处理器,请删除半冒号和s
这样的
#define string char *
在第二种情况下,预处理器会将string
的每次出现替换为char *
,因此如果您声明
string x, y;
它将扩展为
char *x, y;
其中x
如果指向char
和y
的指针只是char
,则这是误导性的,应该避免使用。
还有一件事,当在C中工作时,隐藏一些变量是指针的事实绝不是一个好主意,所以像
这样的事情typedef SomeType *SomeTypeName;
其中SomeType
可以是任何类型,通常是一个坏主意,你可以做一些我已经看到的澄清这一点的东西,你可以将P
附加到SomeType
,像这样
typedef SomeType *SomeTypeP;
但我个人更喜欢*
到typedef
s
答案 2 :(得分:-1)
别。 string
是一个C ++关键字。如果涉及到C ++,它不仅会引起问题,更重要的是,它会引起混淆并隐藏你正在处理指针的事实。
更新:伙计们,这不是关键字。但是,如果您在代码中添加了using namespace std;
,那么string
就是标准库中的C ++类。
我想说的是,为char *
创建别名并不常见,而且可能会让其他人看到您的代码时感到困惑。