440,276 Members | 2,063 Online
Need help? Post your question and get tips & solutions from a community of 440,276 IT Pros & Developers. It's quick & easy.

# Is there any good way to do it

 P: n/a Hello I am writing a big program. I have define a struction typedef struct { int Name; int Year; }birth; Now I'd like to define a sequence of A, such as Birth A = {1,1990} Birth B = {1,1991} ..... I hope to use #define so that A,B can be used as constant. Can I? and is it a good way of programming? Thanks Nov 15 '05 #1
3 Replies

 P: n/a In article <11*********************@z14g2000cwz.googlegroups. com>, wrote:I have define a struction typedef struct{ int Name; int Year;}birth; Now I'd like to define a sequence of A, such as Birth A = {1,1990}Birth B = {1,1991} birth A = {1,1990}; birth B = {1,1991}; :I hope to use #define so that A,B can be used as constant. :Can I? No. What you can do is #define B90 {1,1990} #define B91 {1,1991} birth A = B90; birth B = B91; and use B90 or B91 wherever else in the code that you happen to need to initialize new variables to those values. But A and B will be writable. You cannot create an unwritable structure with any particular contents: the closest you can get is, as in the above, to define textual substituations that happen to expand to the values you need. You could also get fancier with functions that return const pointers to structures. You could probably even have something like const birth B90(void) { birth B90_temp = {1,1990}; return B90_temp; } but returning whole structures tends to make old-time programmers queasy. -- Watch for our new, improved .signatures -- Wittier! Profounder! and with less than 2 grams of Trite! Nov 15 '05 #2

 P: n/a ro******@ibd.nrc-cnrc.gc.ca (Walter Roberson) writes: In article <11*********************@z14g2000cwz.googlegroups. com>, wrote:I have define a structiontypedef struct{ int Name; int Year;}birth;Now I'd like to define a sequence of A, such asBirth A = {1,1990}Birth B = {1,1991} birth A = {1,1990}; birth B = {1,1991}; :I hope to use #define so that A,B can be used as constant. :Can I? No. What you can do is #define B90 {1,1990} #define B91 {1,1991} birth A = B90; birth B = B91; and use B90 or B91 wherever else in the code that you happen to need to initialize new variables to those values. Right, the {1,1990} construct can be used in an initializer, but it can't be used as an expression. C99 has compound literals, but they're not universally supported yet. But A and B will be writable. You cannot create an unwritable structure with any particular contents: the closest you can get is, as in the above, to define textual substituations that happen to expand to the values you need. Of course you can: const birth A = { 1, 1990 }; const birth B = { 2, 1991 }; A and B aren't true "constants"; they're best thought of as read-only variables. But they're probably suitable for the OP's purposes. -- Keith Thompson (The_Other_Keith) ks***@mib.org San Diego Supercomputer Center <*> We must do something. This is something. Therefore, we must do this. Nov 15 '05 #3

 P: n/a Walter Roberson wrote: birth A = {1,1990}; birth B = {1,1991}; :I hope to use #define so that A,B can be used as constant. :Can I? No. The answer is correct for C89 birth A = B90; birth B = B91; and use B90 or B91 wherever else in the code that you happen to need to initialize new variables to those values. But A and B will be writable. You cannot create an unwritable structure with any particular contents: the closest you can get is, as in the Actually, you can define const objects. Except for odd uses of strchr etc. or by use of casts, attempts to write to them always involves a constraint violation; in the exceptional cases, it invokes undefined behaviour. So, they are kind of unwritable. You could also get fancier with functions that return const pointers to structures. You could probably even have something like const birth B90(void) { birth B90_temp = {1,1990}; return B90_temp; } A definition of a function type which is incompatible with birth(void), but which is functionally identical. but returning whole structures tends to make old-time programmers queasy. But using qualified values in C rather than qualified objects just to make someone queasy! Nov 15 '05 #4

### This discussion thread is closed

Replies have been disabled for this discussion.