diff options
Diffstat (limited to 'exercises')
-rw-r--r-- | exercises/093_hello_c.zig | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/exercises/093_hello_c.zig b/exercises/093_hello_c.zig new file mode 100644 index 0000000..ba76a46 --- /dev/null +++ b/exercises/093_hello_c.zig @@ -0,0 +1,69 @@ +// +// When Andrew Kelley announced the idea of a new programming language +// - namely Zig - in his blog on February 8, 2016, he also immediately +// stated his ambitious goal: to replace the C language! +// +// In order to be able to achieve this goal at all, Zig should be +// as compatible as possible with its "predecessor". +// Only if it is possible to exchange individual modules in existing +// C programs without having to use complicated wrappers, +// the undertaking has a chance of success. +// +// So it is not surprising that calling C functions and vice versa +// is extremely "smooth". +// +// To call C functions in Zig, you only need to specify the library +// that contains said function. For this purpose there is a built-in +// function corresponding to the well-known @import(): +// +// @cImport() +// +// All required libraries can now be included in the usual Zig notation: +// +// const c = @cImport({ +// @cInclude("stdio.h"); +// @cInclude("..."); +// }); +// +// Now a function can be called via the (in this example) constant 'c': +// +// c.puts("Hello world!"); +// +// By the way, most C functions have return values in the form of an +// integer value. Errors can then be evaluated (return < 0) or other +// information can be obtained. For example, 'puts' returns the number +// of characters output. +// +// So that all this does not remain a dry theroy now, let's just start +// and call a C function out of Zig. +// +// our well-known "import" for Zig +const std = @import("std"); + +// new the import for C +const c = @cImport({ + + // we use "standard input/output" from C + @cInclude("stdio.h"); +}); + +pub fn main() void { + + // In order to output a text that can be evaluated by the + // Zig Builder, we need to write it to the Error output. + // In Zig we do this with "std.debug.print" and in C we can + // specify the file to write to, i.e. "standard error (stderr)". + // + // Ups, something is wrong... + const c_res = fprintf(c.stderr, "Hello C from Zig!"); + + // let's see what the result from C is: + std.debug.print(" - C result ist {d} chars\n", .{c_res}); +} +// +// Something must be considered when compiling with C functions. +// Namely that the Zig compiler knows that it should include +// corresponding libraries. For this purpose we call the compiler +// with the parameter "lc" for such a program, +// e.g. "zig run -lc hello_c.zig". +// |