Кажется, вы не можете.
В качестве альтернативы, он отлично работает при обычном условии if, и gcc может его оптимизировать.
if (!strcmp(__BASE_FILE__, __FILE__)) {
// works.
}
, но вы не можете определить новые основные функции или использовать другие приемы препроцессора. но вы могли бы замкнуть главный с помощью статических методов, но это резко и грязно.
Но, возможно, тебе не следует этого делать. в Ruby / python это работает, потому что использование файлов выполняется во время выполнения. в C все файлы должны быть скомпилированы для использования.
Имейте в виду, что большинство систем сборки будет создавать по одному файлу за раз, создавая их как объектные файлы и восстанавливая их только при необходимости. Итак
__BASE_FILE__ and __FILE__
будет равен большинству в исходных файлах, если не всегда. И я настоятельно рекомендую вам сделать это в заголовочных файлах.
Проще просто поместить свои тесты в отдельные файлы, связывая их только при необходимости.