s- > size().
, .
GCC
#include <stdio.h>
#include <stdlib.h>
typedef struct {
const char *value;
size_t (*size)();
void (*destroy)();
} string;
#define STRING(A) \
string *A = (string *) malloc(sizeof(string)); \
A->value = ""; \
{ \
size_t size() { \
size_t i; \
\
for(i = 0; A->value[i] != '\0'; ++i); \
return i; \
} \
\
void destroy() { \
free(A); \
} \
\
A->size = &size; \
A->destroy = &destroy; \
}
int main() {
printf("\n=== s1 ===\n");
STRING(s1);
printf("Size: %ld\n", s1->size());
s1->value = "FOOO";
printf("%s\n", s1->value);
printf("Size: %ld\n", s1->size());
printf("\n=== s2 ===\n");
STRING(s2);
printf("Size: %ld\n", s2->size());
s2->value = "BAZ";
printf("%s\n", s2->value);
printf("Size: %ld\n", s2->size());
printf("\n=== s1 ===\n");
s1->value="A";
printf("Size: %ld\n", s1->size());
printf("%s\n", s1->value);
printf("\n=== s2 ===\n");
s2->value="ZZ";
printf("Size: %ld\n", s2->size());
printf("%s\n", s2->value);
s1->destroy();
s2->destroy();
return 0;
}
C
#include <stdio.h>
#include <stdlib.h>
#define STRING(A) \
string *A = (string *) malloc(sizeof(string)); \
A->value = ""; \
A->size = &size; \
A->destroy = &destroy;
#define USE(A) \
s = A;
typedef struct {
const char *value;
size_t (*size)();
void (*destroy)();
} string;
size_t size();
void destroy();
string *s;
size_t size() {
size_t i;
for(i = 0; s->value[i] != '\0'; ++i);
return i;
}
void destroy() {
free(s);
}
int main() {
printf("\n=== s1 ===\n");
STRING(s1);
USE(s1);
printf("Size: %ld\n", s1->size());
s1->value = "FOOO";
printf("%s\n", s1->value);
printf("Size: %ld\n", s1->size());
printf("\n=== s2 ===\n");
STRING(s2);
USE(s2);
printf("Size: %ld\n", s2->size());
s2->value = "BAZ";
printf("%s\n", s2->value);
printf("Size: %ld\n", s2->size());
USE(s1);
printf("\n=== s1 ===\n");
s1->value="A";
printf("Size: %ld\n", s1->size());
printf("%s\n", s1->value);
USE(s2);
printf("\n=== s2 ===\n");
s2->value="ZZ";
printf("Size: %ld\n", s2->size());
printf("%s\n", s2->value);
USE(s1);
s1->destroy();
USE(s2);
s2->destroy();
return 0;
}