C结构作为数据类型

Eri*_*k W 20 c

我希望能够做到这样的事情:

typedef struct
{
    char* c_str;

} string;

string s = "hello";
Run Code Online (Sandbox Code Playgroud)

是否有可能以任何方式做到这一点?

我知道有可能这样做:

typedef struct
{
    char* c_str;

} string;

string s = { "hello" };
Run Code Online (Sandbox Code Playgroud)

但是当它只是一个成员变量时,我不喜欢大括号.

tml*_*len 31

您可以使用a typedef而不是struct:

typedef char* string;
string s = "hello";
Run Code Online (Sandbox Code Playgroud)

但是然后const string会使指针成为常量,而不是指向数据.所以const string s相当于char* const s.解决方案可能是为const字符串定义一个附加类型:

typedef char* string;
typedef const char* const_string;
Run Code Online (Sandbox Code Playgroud)

对于原始结构,同样如此.(C++具有相同的"问题",这就是为什么它具有iteratorconst_iterator在其容器的类型.)

typedef对指针类型的一个优点是你可以输入

string s1, s2, s3;
Run Code Online (Sandbox Code Playgroud)

代替

char *s1, *s2, *s3;
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是,一个众所周知的问题与指针的`typedef`一起出现的事实是`const`应用于指针而不是指向数据.换句话说,`const string s`将等同于`char*const s`而不是`const char*s`(这是你通常所期望的). (9认同)

Kra*_*rab 14

在C中,它是不可能的,但如果添加带有一个适当参数的构造函数,则可以在C++中完成.编译器将完成剩下的工作.如果要避免此隐式转换行为,可以将构造函数标记为显式.

在C++中:

struct string {

    char * m_c_str;

    /* explicit */ string(char* c_str) : m_c_str(c_str) { }
};

int main(int argc, char * argv[]) {

    string s = "hello";

    return 0;

}
Run Code Online (Sandbox Code Playgroud)