course-c

Introduction to Functions

Function Declaration

Function Definition

return-type function-name (argument declarations) {
  declarations and statements
  return statement returns a value of type return-type
}
return expression;

Variable Declaration

Variable Declaration Example

int a;

int main() {
  int a = 10; // "a" is local to main
  print(); // prints "a: 0"
}

int print() {
  printf("a: %d\n", a);
}

External variables

extern keyword

:::: {.columns}

::: {.column width=”40%”}

:::

::: {.column width=”60%”}

  int a;

  int main() {
    int a = 10; // "a" is local to main
    print(); // prints "a: 0"
  }

  int print() {
    extern int a;
    printf("a: %d\n", a);
  }

:::

::::

auto keyword

:::: {.columns}

::: {.column width=”40%”}

:::

::: {.column width=”60%”}

  int a;

  int main() {
    auto int a = 10; // "a" is local to main
    print(); // prints "a: 0"
  }

  int print() {
    extern int a;
    printf("a: %d\n", a);
  }

:::

::::

static variables

:::: {.columns}

::: {.column width=”40%”}

:::

::: {.column width=”60%”}

  int main() {
    print(); // prints "a: 0"
    print(); // prints "a: 1"
  }

  int print() {
    static int a;
    printf("a: %d\n", a++);
  }

:::

::::

register variables

Variable initialization

Recursion

Recursion – Example

int main() {
  print(1);
}

int print(int i) {
  printf("i:%d\n", i++);
  if (i > 5) return;
  else print(i);
}

Header files

Macro definition and substitution

Un-define macros

Macro with arguments

Macro with arguments – additional syntax

#define debug_print(expression) printf(\
  #expression " = %g\n", expression)
debug_print(x); //printf("x" " = %g\n", x);

#define concat(prefix, suffix) prefix ## suffix
concat(name, 1); //name1;

Conditional inclusion

Enable and disable tracing

:::: {.columns}

::: {.column width=”40%”}

:::

::: {.column width=”60%”}

  #define TRACE_NONE 0
  #define TRACE_DEBUG 1
  #define TRACE_ALL 2

  #define TRACE_LEVEL TRACE_DEBUG

  int main() {
  #if TRACE_LEVEL == TRACE_ALL || \
      TRACE_LEVEL == TRACE_DEBUG
    printf("within main\n");
  #endif
    return 0;
  }

:::

::::

OS specific codes

:::: {.columns}

::: {.column width=”60%”}

#if !defined(OSNAME)
  #error OSNAME not specified
#endif

#if OSNAME == LINUX
  printf("Linux\n");
#else
  printf("Windows\n");
#endif

:::

::: {.column width=”40%”}

:::

::::

Include header file just once

#ifndef _HDR_H_
#define _HDR_H_
  declarations
#endif

Exercise