# Exercises

### Exercises

Exercise 16-1. Write a C file containing this function:

```c
int add(int a, int b) {
    return a + b;
}
```

Write a Zig program that declares it with `extern fn`, calls it, and prints the result.

Exercise 16-2. Rewrite Exercise 16-1 using a header file and `@cImport`.

Exercise 16-3. Write a C function:

```c
void greet(const char *name);
```

Call it from Zig. Use the correct Zig type for the string parameter.

Exercise 16-4. Import `stdio.h` and call `puts` from Zig.

Exercise 16-5. Export this Zig function:

```zig
export fn square(x: c_int) c_int {
    return x * x;
}
```

Call it from a C program.

Exercise 16-6. Define a C struct:

```c
struct Point {
    int x;
    int y;
};
```

Define the matching Zig type with `extern struct`, pass it to Zig, and return `x + y`.

Exercise 16-7. Show why a Zig slice should not be exported directly to C. Rewrite the interface using pointer plus length.

Exercise 16-8. Build a Zig executable that links one C source file, one C header file, and one static library.

Exercise 16-9. Move all C linking options into `build.zig`.

Exercise 16-10. Write a small Zig wrapper around a C API. The exported C-shaped layer should be thin. The rest of the program should use ordinary Zig types.

