---
name: "libppl"
section: "3"
platform: "linux"
package: "ppl"
version: "1.2-7"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/libppl"
---

# libppl(3)

the C++ interface of the Parma Polyhedra Library

## NAME

libppl - the C++ interface of the Parma Polyhedra Library

## SYNOPSIS

**#include \<ppl.hh\>**

c++ file.cc **-lppl**

## DESCRIPTION

This is a short overview on how to use the Parma Polyhedra Library (PPL) in your C++ programs on Unix-like operating systems. Note that the PPL has interfaces also for C, Java, OCaml and a number of Prolog systems: look elsewhere for documentation on those. Note also that the present document does not describe the library functionality, its classes or its methods and functions: see *The Parma Polyhedra Library User's Manual (version 1.2)* for this kind of information.

## INCLUDING THE HEADER FILE

The C++ interface of the PPL has only one header file, named *ppl.hh*.  So your program should contain a directive of the form

**#include \<ppl.hh\>**

Of course, you must make sure you installed the PPL in a place where the compiler can find it, either by itself or with the help of a suitable **-Idir** command line option (see the file *INSTALL* for information on how to configure the library so that it is installed in the place of your choice).

## INITIALIZING AND FINALIZING THE LIBRARY

The mere inclusion of *ppl.hh* in at least one file of your project will cause the automatic initialization and finalization of the library. However, there are situations in which automatic initialization and finalization is not desirable (e.g., if the application fiddles with the GMP's memory allocation functions).  In those cases, **every** inclusion of *ppl.hh* must take the form

```
#define PPL_NO_AUTOMATIC_INITIALIZATION
#include <ppl.hh>
```

When automatic initialization and finalization is disabled you must **absolutely** call the function

**void Parma\_Polyhedra\_Library::initialize()**

before using the library. It is also a good norm to call the function

**void Parma\_Polyhedra\_Library::finalize()**

when you are done with the library.

## USING THE LIBRARY

Keeping in mind that there is no substitute for a careful reading of *The Parma Polyhedra Library User's Manual (version 1.2)*, you can find many examples of use in the directories **tests** (see the **README** file in that directory) and **demos/ppl\_lcdd** of the source distribution.

## LINKING WITH THE LIBRARY

Linking with the C++ interface of the Parma Polyhedra Library is best done using the C++ compiler itself: usually, specifying the **-lppl** command line option is enough.  In fact, if you use a shared version of the library, this automatically records the dependency from the GMP library, something that the linker ought to deal with gracefully. Otherwise you will have to add **-lgmpxx -lgmp** to the command line. Things are more complex if you installed the PPL into some nonstandard place.  In this case you will have to use the **-Ldir** option and, if you use a shared version of the library, possible take further steps: see the documentation of your system for more information on this subject (the *Program Library HOWTO* is especially valuable for GNU/Linux users).

## IMPLEMENTING MEMORY-GUARDED COMPUTATIONS

One of the interesting features of the Parma Polyhedra Library is the possibility to implement memory-guarded computations.  The idea is that you can limit the amount of virtual memory available to the process, launch a PPL computation, and be ready to catch an **std::bad\_alloc** exception.  Since the library is exception-safe, you can take the appropriate corrective measures (e.g., simplify the polyhedra and/or select less precise though less complex algorithms), and restart the computation. In order to do that, you should define alternative memory allocation functions for GMP that throw **std::bad\_alloc** upon memory exhaustion. For instance:

```
#include <new>
#include <cstdlib>
extern "C" void*
cxx_malloc(size_t size) {
  void* p = malloc(size);
  if (p != 0 || size == 0)
    return p;
  throw std::bad_alloc();
}
extern "C" void*
cxx_realloc(void* q, size_t, size_t new_size) {
  void* p = realloc(q, new_size);
  if (p != 0 || new_size == 0)
    return p;
  throw std::bad_alloc();
}
extern "C" void
cxx_free(void* p, size_t) {
  free(p);
}
```

Then you must install these functions and this can be done in two different ways:

- (1)

  If your C++ compiler supports **\_\_attribute\_\_ ((weak))** and you do not have any other special needs, then you can simply link to your application a C function **ppl\_set\_GMP\_memory\_allocation\_functions(void)** such as

  ```
  extern "C" void
  ppl_set_GMP_memory_allocation_functions(void) {
    mp_set_memory_functions(cxx_malloc, cxx_realloc, cxx_free);
  }
  ```

  This is all that you have to do, whether or not you use the automatic initialization feature of the library (see above): in any case the initialization procedure will automatically call **ppl\_set\_GMP\_memory\_allocation\_functions(void).**

- (2)

  If your C++ compiler does not support **\_\_attribute\_\_ ((weak))** then you cannot use the automatic initialization feature of the library (see above) and should write a main program of the form

  ```
  int main() {
    // The ordering of the following function calls is important.
    mp_set_memory_functions(cxx_malloc, cxx_realloc, cxx_free);
    Parma_Polyhedra_Library::initialize();
    ...
  ```

## USING NATIVE FLOATING POINT NUMBERS

At initialization time, the Parma Polyhedra Library sets the FPU rounding mode in a way that allows its floating-point-based computations to be conservative (i.e., possibly approximated but correct) and reasonably efficient.  In case your application itself uses native floating point numbers and relies on a particular rounding mode (if you are in doubt, assume that it does rely on round-to-nearest to be in effect), you should use the function

**void Parma\_Polyhedra\_Library::restore\_pre\_PPL\_rounding()**

after the PPL initialization and before using native floating point numbers in the application. If your application does not use any floating-point-based PPL abstraction, no further measure should be taken. Otherwise, it is imperative to call the function

**void Parma\_Polyhedra\_Library::set\_rounding\_for\_PPL()**

before invoking any PPL interface related to such abstractions.

## SEE ALSO

**[ppl-config(1)](/ppl-config/1.md)**

Roberto Bagnara, Patricia M. Hill, and Enea Zaffanella. *The Parma Polyhedra Library User's Manual (version 1.2)*, available (in several formats) at **http://bugseng.com/products/ppl/** .

David A. Wheeler. *Program Library HOWTO*, available (in several formats) at **http://www.dwheeler.com/program-library/** .

## AVAILABILITY

The latest version of the Parma Polyhedra Library and all the documentation is available at **http://bugseng.com/products/ppl/** .

## AUTHOR

See the file **CREDITS** in the source distribution or use the command **ppl-config --credits** for a list of contributors.

## REPORTING BUGS

Report bugs to \<ppl-devel@cs.unipr.it\>.

## COPYRIGHT AND NO WARRANTY

Copyright (C) 2001-2010 Roberto Bagnara \<bagnara@cs.unipr.it\> Copyright (C) 2010-2016 BUGSENG srl (http://bugseng.com)\
 This is free software; see the file **COPYING** in the source distribution or use the command **ppl-config --copying** to obtain the copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
