Συνοπτικός οδηγός σύνταξης για τον C Preprocessor (cpp), ο οποίος μπορεί να κληθεί ανεξάρτητα ή εντός του εργαλείου μεταγλώττισης C/C++.
Αυτόνομη προεπεξεργασία
Εκτέλεση του προεπεξεργαστή απευθείας χωρίς κλήση του μεταγλωττιστή:
# Η επιλογή -P απενεργοποιεί τη δημιουργία linemarkers
cpp -P source.c > preprocessed.c
Συμπερίληψη κεφαλίδων (Headers)
#include <stdio.h> /* Κεφαλίδες συστήματος και βασικής βιβλιοθήκης */
#include "my_header.h" /* Τοπικές κεφαλίδες έργου */
Ορισμοί μακροεντολών
#define BUFFER_SIZE 1024
#define PI 3.1415926535
/* Κατάργηση ορισμού μακροεντολής */
#undef BUFFER_SIZE
Μακροεντολές τύπου συνάρτησης
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define DEG_TO_RAD(x) ((x) * 0.0174532925)
Μετατροπή σε συμβολοσειρά (#)
Ο τελεστής # μετατρέπει παραμέτρους μακροεντολής σε συμβολοσειρές:
#define STR(name) #name
#define PRINT_VAR(x) printf("%s = %d\n", #x, x)
char *var_name = STR(my_object); /* → "my_object" */
Συνένωση tokens (##)
Ο τελεστής ## συνενώνει δύο tokens σε ένα:
#define COMMAND(NAME) { #NAME, NAME ## _command }
struct command commands[] = {
COMMAND(quit), /* → { "quit", quit_command } */
COMMAND(help) /* → { "help", help_command } */
};
Υπό όρους μεταγλώττιση
#ifdef DEBUG
#define LOG(msg) printf("[DEBUG] %s\n", msg)
#elif defined(VERBOSE)
#define LOG(msg) printf("[INFO] %s\n", msg)
#else
#define LOG(msg) /* noop */
#endif
/* Include guards για αποφυγή πολλαπλής συμπερίληψης */
#ifndef MY_HEADER_H
#define MY_HEADER_H
/* δηλώσεις εδώ */
#endif /* MY_HEADER_H */
Διαγνωστικά & προειδοποιήσεις
#if __STDC_VERSION__ < 201112L
#warning "C11 features are not fully enabled"
#endif
#if !defined(REQUIRED_CONFIG)
#error "REQUIRED_CONFIG must be defined before compilation"
#endif
Τυπικές προκαθορισμένες μακροεντολές
__FILE__: Τρέχον όνομα αρχείου πηγαίου κώδικα ως συμβολοσειρά.__LINE__: Τρέχων αριθμός γραμμής ως ακέραιος.__DATE__: Ημερομηνία μεταγλώττισης ως συμβολοσειρά (Mmm dd yyyy).__TIME__: Ώρα μεταγλώττισης ως συμβολοσειρά (hh:mm:ss).