Β val = { fltnum = 6.6614606209589101e-316, sp = 0x0,Β slen = 0, sref = 1, idx = 0),Β hash = {next = 0x8095598, name = 0x0, length = 0,Β value = 0x0, ref = 1}}, type = Node_K_print, flags = 1}ΠΡΠΎ ΠΊΡΡΠ° Π²ΡΠ·ΠΊΠΎΠΉ ΠΌΠ°ΡΡΡ. ΠΠ΄Π½Π°ΠΊΠΎ, GDB Π²ΡΠ΅ ΠΆΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΏΡΠΎΡΠ°Π΅Ρ Π΅Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ Π²ΡΠΎΠ΄Π΅ '
($1).sub.val.slenΠΡΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΡΠΈΡΠΈΠ½Ρ Π΄Π»Ρ ΠΈΠ·Π±Π΅Π³Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ. ΠΡΠ΅ΠΆΠ΄Π΅ Π²ΡΠ΅Π³ΠΎ, ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π½Π΅ ΠΏΡΠΎΠ²Π΅ΡΡΡΡΡΡ. ΠΠΈΡΡΠΎ, ΠΊΡΠΎΠΌΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ°, Π½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ ΠΊΠΎΠ³Π΄Π° Π²Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΠ΅ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ°ΡΡΠΈ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ, Π²Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΠ΅ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠΎΠΉ ΡΠ°ΡΡΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ»Π° ΡΠΎΡ ΡΠ°Π½Π΅Π½Π° ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ. ΠΡ Π²ΠΈΠ΄Π΅Π»ΠΈ ΡΡΠΎ Π²
ch15-union.cΠΡΠΎΡΠ°Ρ ΠΏΡΠΈΡΠΈΠ½Π°, ΡΠ²ΡΠ·Π°Π½Π½Π°Ρ Ρ ΠΏΠ΅ΡΠ²ΠΎΠΉ, Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΠΎΡΡΠΎΡΠΎΠΆΠ½ΠΎΡΡΠΈ Ρ ΠΏΠ΅ΡΠ΅ΠΊΡΡΡΠΈΡΠΌΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΡ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΉ
structuniongawk/* n->lnode ΠΏΠ΅ΡΠ΅ΠΊΡΡΠ²Π°Π΅Ρ ΡΠ°Π·ΠΌΠ΅Ρ ΠΌΠ°ΡΡΠΈΠ²Π°, Π½Π΅ Π²ΡΠ·ΡΠ²Π°ΠΉΡΠ΅ unref, Π΅ΡΠ»ΠΈ ΡΡΠΎ ΠΌΠ°ΡΡΠΈΠ² */if (n->type != Node_var_array && n->type != Node_array_ref)unref(n->lnode);ΠΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΠΎ
ifunref()NODEn->lnodegawkΠ ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΡΡΡΡΠΏΠ»Π΅Π½ΠΈΡ, ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠ΅Π½Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ Π² Π‘++. ΠΠ°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΡΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΈ ΡΡΡΡΠΊΡΡΡΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ ΡΠΎΠ²ΡΠ΅ΠΌ Π΄ΡΡΠ³ΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½Π΅Π΅.
Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ: ΠΏΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΈΠ·Π±Π΅Π³Π°ΠΉΡΠ΅ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ (
union15.4.2. ΠΡΠ»Π°ΠΆΠΈΠ²Π°Π΅ΠΌΡΠΉ ΠΊΠΎΠ΄ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ
ΠΠΎΠΌΠΈΠΌΠΎ ΡΠ΅Ρ Π²Π΅ΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²Ρ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΠ΅ ΠΊ ΡΠ²ΠΎΠ΅ΠΌΡ ΠΊΠΎΠ΄Ρ Π΄Π»Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΊΠΎΠ΄ Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ ΠΎΡΠ»Π°Π΄ΠΊΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΡΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ Π² ΠΏΠΎΠ»Π΅Π²ΡΡ ΡΡΠ»ΠΎΠ²ΠΈΡΡ , ΠΊΠΎΠ³Π΄Π° Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° (Π° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ, Π΄Π°ΠΆΠ΅ ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ°!)
Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΄Π° Π»Π΅Ρ, ΠΎΡ ΠΏΡΠΎΡΡΡΡ Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΡ . ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π½Π°ΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΠ΅ Π½ΠΈ Π² ΠΊΠΎΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΡΡΠ΅ΡΠΏΡΠ²Π°ΡΡΠΈΠΌ. ΠΡΠΎ ΠΎΠ±Π»Π°ΡΡΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΡΠΎΠΈΡ ΠΈΠΌΠ΅ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΠΎΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ!
15.4.2.1. ΠΠΎΠ±Π°Π²Π»ΡΠΉΡΠ΅ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΡΠ΅ ΠΎΠΏΡΠΈΠΈ ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅
ΠΡΠΎΡΡΠ΅ΠΉΡΠ΅ΠΉ ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠΎΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΎΠΏΡΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ, Π΄Π΅Π»Π°ΡΡΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌ ΠΎΡΠ»Π°Π΄ΠΊΡ. Π’Π°ΠΊΠ°Ρ ΠΎΠΏΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΠ»ΠΎΠ²Π½ΠΎ ΠΎΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ. ΠΠ΄Π½Π°ΠΊΠΎ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΡΡΠ°Π²ΠΈΡΡ ΠΎΠΏΡΠΈΡ Π² Π³ΠΎΡΠΎΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. (ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°ΠΊΠΆΠ΅ ΡΠ΅ΡΠΈΡΡ, ΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΈΠ»ΠΈ Π½Π΅ ΠΎΡΡΠ°Π²Π»ΡΡΡ ΡΡΡ ΠΎΠΏΡΠΈΡ Π½Π΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ. ΠΠ΄Π΅ΡΡ Π΅ΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠΏΡΠΎΠΌΠΈΡΡΡ: Π΅Π΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π΄Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π²Π°ΡΠΈΠΌ ΠΏΠΎΠΊΡΠΏΠ°ΡΠ΅Π»ΡΠΌ ΠΈΠ»ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ Π±ΠΎΠ»ΡΡΠ΅ ΠΈΠ·ΡΡΠΈΡΡ Π²Π½ΡΡΡΠ΅Π½Π½ΠΎΡΡΠΈ Π²Π°ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΡ, ΡΠ΅Π³ΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π΅ Ρ ΠΎΡΠ΅ΡΡ Π‘ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, Π½Π΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΅Π΅ ΠΊΠ°ΠΆΠ΅ΡΡΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΏΠΎΠ΄Π»ΡΠΌ. ΠΡΠ»ΠΈ Π²Ρ ΠΏΠΈΡΠ΅ΡΠ΅ Π΄Π»Ρ Open Source ΠΈΠ»ΠΈ Free Software, Π»ΡΡΡΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠΏΡΠΈΡ.)
ΠΡΠ»ΠΈ Π²Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π±ΠΎΠ»ΡΡΠ°Ρ, ΠΎΡΠ»Π°Π΄ΠΎΡΠ½Π°Ρ ΠΎΠΏΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ, ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΠΈΠΉ, ΠΊΠ°ΠΊΡΡ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΡ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΎΡΠ»Π°ΠΆΠΈΠ²Π°ΡΡ. ΠΠ° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΡΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠ»Π°Π³ΠΎΠ²ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΈΠ»ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠ»Π°Π³ΠΎΠ²ΡΠ΅ Π±ΠΈΡΡ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ. ΠΠΎΡ ΡΡ Π΅ΠΌΠ° ΡΡΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠΈ:
struct option options[] = {Β ...Β { "debug", required_argument, NULL, 'D' },Β ...};int main(int argc, char **argv) {Β int c;Β while ((c = getopt_long(argc, argv, "...D:")) != -1) {Β switch (c) {Β Β ...Β case 'D':Β Β parse_debug(optarg);Β Β break;Β Β ...Β }Β }Β ...}Π€ΡΠ½ΠΊΡΠΈΡ
parse_debug()file,memory,ipcextern int debugging;void parse_debug(const char *subsystems) {Β char *sp;Β for (sp = subsystems; *sp != '\0';) {Β if (strncmp(sp, "file", 4) == 0) {Β Β debugging |= DEBUG_FILE;Β Β sp += 4;Β } else if (strncmp(sp, "memory", 6) == 0) {Β Β debugging |= DEBUG_MEM;Β Β sp += 6;Β } else if (strncmp(sp, "ipc", 3) == 0) {Β Β debugging |= DEBUG_IPC;Β Β sp += 3;Β Β ...Β }Β while (*sp == ' ' || *sp == ',') sp++;Β }}Π ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌ ΡΡΠ΅ΡΠ΅ ΠΊΠΎΠ΄ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΠ»Π°Π³ΠΈ:
if ((debugging & DEBUG_FILE) != 0) ...Β /* Π ΡΠ°ΡΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π΄Π»Ρ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π° */if ((debugging & DEBUG_MEM) != 0) ... /* Π ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ΅ ΠΏΠ°ΠΌΡΡΠΈ */ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΠΈ ΠΎΠ΄Π½Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Ρ ΡΠ»Π°Π³ΠΎΠ²ΡΠΌΠΈ Π±ΠΈΡΠ°ΠΌΠΈ, ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ², ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΡΠ΅ΠΌΡΠΉ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ°ΠΌΠΈ (ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΈΠ·
enum