---
name: "shtool-scpp"
section: "1"
platform: "linux"
package: "shtool"
version: "2.0.8-10"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/shtool-scpp"
---

# shtool-scpp(1)

GNU shtool C source file pre-processor

## NAME

shtool-scpp - GNU shtool C source file pre-processor

## SYNOPSIS

**shtool scpp** \[**-v**\|**--verbose**\] \[**-p**\|**--preserve**\] \[**-f**\|**--filter** *filter*\] \[**-o**\|**--output** *ofile*\] \[**-t**\|**--template** *tfile*\] \[**-M**\|**--mark** *mark*\] \[**-D**\|**--define** *dname*\] \[**-C**\|**--class** *cname*\] *file* \[*file* ...\]

## DESCRIPTION

This command is an additional ANSI C source file pre-processor for sharing [**cpp**(1)](/cpp/1.md) code segments, internal variables and internal functions. The intention for this comes from writing libraries in ANSI C. Here a common shared internal header file is usually used for sharing information between the library source files.

The operation is to parse special constructs in *file*s, generate a few things out of these constructs and insert them at position *mark* in *tfile* by writing the output to *ofile*. Additionally the *file*s are never touched or modified. Instead the constructs are removed later by the [**cpp**(1)](/cpp/1.md) phase of the build process. The only prerequisite is that every *file* has a \`\``"#include ""`*ofile*`"""`'' at the top.

This command provides the following features: First it avoids namespace pollution and reduces prototyping efforts for internal symbols by recognizing functions and variables which are defined with the storage class identifier \`\`*cname*''.  For instance if *cname* is \`\`intern'', a function \`\``"intern` `void *foobar(int quux)"`'' in one of the *file*s is translated into both a \`\``"#define foobar __foobar"`'' and a \`\``"extern void *foobar(int quux);"`'' in *ofile*. Additionally a global \`\``"#define"` *cname* `"/**/"`'' is also created in *ofile* to let the compiler silently ignore this additional storage class identifier.

Second, the library source files usually want to share `"typedef"`s, `"#define"`s, etc.  over the source file boundaries. To achieve this one can either place this stuff manually into *tfile* or use the second feature of **scpp**: All code in *file*s encapsulated with \`\``"#if "`*dname* ... `"#endif"`'' is automatically copied to *ofile*. Additionally a global \`\``"#define"` *dname* `0`'' is also created in *ofile* to let the compiler silently skip this parts (because it was already found in the header).

## OPTIONS

The following command line options are available.

- **-v**, **--verbose**

  Display some processing information.

- **-p**, **--preserve**

  Preserves *ofile* independent of the generated \`\`#line'' lines. This is useful for Makefiles if the real contents of *ofile* will not change, just line numbers. Default is to overwrite.

- **-f**, **--filter** *filter*

  Apply one or more pre-processing [**sed**(1)](/sed/1.md) *filter* commands (usually of type \`\``"s/.../.../"`'') to each input file before their input is parsed. This option can occur multiple times.

- **-o**, **--output** *ofile*

  Output file name. Default is `"lib.h"`.

- **-t**, **--template** *tfile*

  Template file name. Default is `"lib.h.in"`.

- **-M**, **--mark** *mark*

  Mark to be replaced by generated constructs. Default is `"%%MARK%%"`.

- **-D**, **--define** *dname*

  FIXME. Default is `"cpp"`.

- **-C**, **--class** *cname*

  FIXME. Default is `"intern"`.

## EXAMPLE

```
 #   Makefile
 SRCS=foo_bar.c foo_quux.c
 foo_p.h: foo_p.h.in
      shtool scpp -o foo_p.h -t foo_p.h.in \
                  -M %%MARK%% -D cpp -C intern $(SRCS)
 /* foo_p.h.in */
 #ifndef FOO_P_H
 #define FOO_P_H
 %%MARK%%
 #endif /* FOO_P_H */
 /* foo_bar.c */
 #include "foo_p.h"
 #if cpp
 #define OURS_INIT 4711
 #endif
 intern int ours;
 static int myone = 0815;
 intern int bar(void)
 {
     ours += myone;
 }
 /* foo_quux.c */
 #include "foo_p.h"
 int main(int argc, char *argv[])
 {
     int i;
     ours = OURS_INIT
     for (i = 0; i < 10; i++) {
         bar();
         printf("ours now %d\n", ours);
     }
     return 0;
 }
```

## HISTORY

The **GNU shtool** **scpp** command was originally written by Ralf S. Engelschall \<rse@engelschall.com\> in 1999 for **GNU shtool**. Its was prompted by the need to have a pre-processing facility in the **GNU pth** project.

## SEE ALSO

[**shtool**(1)](/shtool/1.md), [**cpp**(1)](/cpp/1.md).
