Eu tenho uma estrutura no seguinte formato
typedef struct small {
int a;
} small;
typedef struct large {
small* s;
int b;
} large;
Eu gostaria de escrever uma função que modifique a variável a
. No entanto, na declaração/assinatura da função eu gostaria de ter small
nos moldes de
void modifyA(small* s, int newVal){
s->a = newVal;
}
Eu gostaria de manter a modifyA
função comum para ser fornecida com large
e small
. Existe uma maneira de conseguir isso large
como entrada para modifyA
funcionar?
Por exemplo, eu quero
int main(){
large* l;
small* s;
int newVal = 10;
// assume all member of l and s are initialized properly
modifyA(&l->s, 10);
modifyA(s, 10);
return 0;
}
modifyA()
pega um ponteiro para asmall
elarge
possui um membro que é umsmall
objeto, então você pode simplesmente passar um ponteiro para esse membro, por exemplo:UPDATE : você alterou o código da sua pergunta para tornar o
large::small
membro umsmall*
ponteiro em vez de umsmall
objeto. Nesse caso, simplesmente elimine o&
operador ao passar esse membro paramodifyA()
:Outra opção em C é usar a magia dos genéricos:
A macro simplesmente resolve chamar a função correta para o argumento inicial (nomeado
X
na macro). Conseqüentemente, obtemos a saída desejada para o ponteiro do argumento: