В C-коде сделайте ваши функции статичными по умолчанию. Создавайте нестатические функции и декларации .h только для функций, которые понадобятся другим модулям.
В коде C ++ поместите те функции, которые являются локальными для файла, в анонимное пространство имен , а сделает их статическими. По крайней мере, в компиляторе GNU это приведет к лучшему и наименьшему коду, потому что никакая функция не будет написана, если все использования встроены. Если вы хотите, чтобы он был встроенным, то, конечно, его пометка даже лучше, чем статическая.
Я не знаю, почему g ++ вообще записывает невостребованные тела функций, которые находятся в анонимных пространствах имен, но это так. Функции со скрытой видимостью, кажется, также обнаруживаются; помечены как скрытые символы, но все еще производят неиспользуемые блоки кода в объектном файле. GCC, вероятно, не понимает, что код не нужен в этих случаях. Или я что-то упускаю, всегда возможно.