Writing Extensions in C with Inline::C (Perl Cookbook, 2nd Edition)

## 12.19. Writing Extensions in C with Inline::C

### 12.19.1. Problem

You'd like to write functions in C that you can call from Perl. You may already have tried XS and found it harmful to your mental health.

### 12.19.2. Solution

Use the Inline::C module available from CPAN:

>     use Inline C;
>     $answer = somefunc(20, 4);
>     print "$answer\n";               # prints 80
>     _ _END_ _
>     _ _C_ _
>     double somefunc(int a, int b) {  /* Inline knows most basic C types */
>       double answer = a * b;
>       return answer;
>     }

### 12.19.3. Discussion

Inline::C was created as an alternative to the XS system for building C extension modules. Rather than jumping through all the hoopla of h2xs and the format of an .xs file, Inline::C lets you embed C code into your Perl program. There are also Inline modules for Python, Ruby, and Java, among other languages.

By default, your C source is in the `_ _END_ _` or `_ _DATA_ _` section of your program after a `_ _C_ _` token. This permits multiple Inlined language blocks in a single file. If you want, use a here document when you load Inline:

>     use Inline C <<'END_OF_C';
>     double somefunc(int a, int b) {  /* Inline knows most basic C types */
>       double answer = a * b;
>       return answer;
>     }
>     END_OF_C

Inline::C scans the source code for ANSI-style function definitions. When it finds a function definition it knows how to deal with, it creates a Perl wrapper for the function. Inline can automatically translate the basic C data types (`double`, `int`, `char *`, etc.) by using the typemap that comes with Perl. A typemap shows Perl how to convert between C values and Perl data types, and you can install your own if you need to use more complex data structures than the basic typemap supports.

You can link against external libraries, parse header files as h2xs does, pass and return multiple values, handle objects, and more. See the Inline::C-Cookbook manpage that comes with the Inline::C module for more details.

### 12.19.4. See Also

The documentation with the Inline::C module from CPAN; the Inline::C-Cookbook manpage

Copyright © 2003 O'Reilly & Associates. All rights reserved.