结构中的算术运算

时间:2013-07-22 09:50:56

标签: c structure

C语言是否可以这样:

typedef struct S {
    char a;
    int b;
    int c = this.a * 60 + this.b;
} S;

这种类型的结构在我的代码中非常有用。

5 个答案:

答案 0 :(得分:3)

不,在C中,您无法在声明中分配记住值,这将是编译时错误。

但我可以建议一个解决方案(可能你也喜欢):

#define INIT(this, a, b)  {a, b, (this).a * 60 + (this).b}

并称之为:

S s = INIT(s, '5', 6);

答案 1 :(得分:2)

不,但您可以创建一个为您进行初始化的工厂函数:

// With a name like alloc, it's clear that the 
// user is responsible for freeing the memory allocated.
S* alloc_s(char a, int b) {
    S* s = malloc(sizeof(S));
    s->a = a;
    s->b = b;
    s->c = s->a * 60 + s->b;
    return s;
}

答案 2 :(得分:1)

不,C中没有这样的功能(甚至在GNU C中也没有)。您不能拥有结构对象成员的默认值。

答案 3 :(得分:0)

不,你不能。它会在编译时触发错误。但是,如果您希望c具有特定值,您可以执行以下操作: static const int c = 666;

答案 4 :(得分:0)

如果不先知道a和b,就无法计算表达式。 你可以像这样模拟这个类:

#include <stdio.h>
#include <stdlib.h>

struct S;

typedef  struct S {
    char a;
    int b;
    int (*getC)(struct S* sss);
} S;

int getC(S* sss) { return sss->a*60+sss->b; }

S* make_S()
{
    S* p = (S*)malloc(sizeof(S));
    if(p==NULL) return NULL;
    p->getC = &getC;
    return p;
}

int main()
{
    S* s1 = make_S();

    s1->a = 1;
    s1->b = 2;
    printf("%i\n", s1->getC(s1));
    free(s1);
    return 0;
}