#include #include #define PR(X, ...) printf("Message " #X ": " __VA_ARGS__) #define DEBUGPRINT fprintf (stderr, "debug in %d line func: %s\n", __LINE__, __func__) int main(void) { DEBUGPRINT; printf("File: %s\n", __FILE__); #line 100 "help.c" DEBUGPRINT; #line 200 DEBUGPRINT; printf("File: %s\n", __FILE__); #ifndef __APPLE__ //~ #error This code work only in MacOs #endif /* * Единственное применение, которое я могу придумать, — это приведение номеров строк в порядок * после длинной серии многострочных макросов. * В основном он используется для предоставления имен файлов и номеров строк исходного файла, из которого был создан файл C (будь то заголовок или реализация). Учитывая это, компилятор выдаст диагностику, которая намекает на исходный файл, а не на сгенерированный файл. Препроцессоры также используют это для указания на включенные заголовки в предварительно обработанном файле, в котором они расширены. */ return 0; }