Если вы можете контролировать проект (например, на месте или платите кому-то другому за это), вы можете просто установить правила и использовать обзоры и инструменты для их обеспечения. В этом нет особой необходимости в языке, вы можете, например, потребовать, чтобы все функции, используемые вне модуля (= набор файлов, даже не должны быть отдельными), были помечены таким образом. По сути, вы заставляете разработчиков думать об интерфейсах и придерживаться их.
Если вы действительно хотите высказать свое мнение, вы можете определить макросы, чтобы показать это, например,
#define PUBLIC
#define PRIVATE static
или что-то подобное.
Так что вы правы, дисциплина является ключом здесь. Он включает в себя установление правил и обеспечение их соблюдения.