#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "str_type.h"
size_t length (CharPtr str) { return strlen(str); }
void message () {
CharPtr str = malloc (255);
if (! str) { return; }
strcpy (str, "The Message");
printf("%s\n", str);
free (str);
}
int main () {
CharPtr str = "Some Static String";
CharPtr str1, str2, str3;
printf ("Length: %d\n", length (str));
message ();
printf ("sizeof(str1): %d\n", sizeof (str1));
printf ("sizeof(str2): %d\n", sizeof (str2));
return 0;
}
If str_type.h contains
typedef char * CharPtr;
Then the output of running that program is
Length: 18
The Message
sizeof(str1): 8
sizeof(str2): 8
However, if that file contains
#define CharPtr char *
You instead get
Length: 18
The Message
sizeof(str1): 8
sizeof(str2): 1
Notice that since the CharPtr is no longer a type you get
char * str1, str2, str3;
after the processing phase of translation and the asterisk only binds to the first variable leaving the remaining two as plain char variables.
Use #define directives only to provide textual substitution prior to translation; it does not interact with - or compliment - the type system.
No comments :
Post a Comment