Você precisa usar aspas duplas, assim:
sed -i "1i void $name_main()" "$name_c"
Explicação
Considere aspas simples:
sed -i '1i void $name_main()' '$name_c'
O shell não interfere nas strings entre aspas simples. Eles são passados para sed
inalterado. Portanto, a string literal $name_main
aparecerá na saída. Da mesma forma, este comando tentará atuar no nome do arquivo $name_c
em vez do nome dado pelo valor dessa variável do shell.
Não considere citações:
sed -i 1i void $name_main() $name_c
Sem citações, o shell executará a divisão de palavras. Isso pode causar todos os problemas. Além disso, sem aspas, o shell espera que os parênteses iniciem uma subcamada. Você também não quer isso.
Com aspas duplas, a substituição da variável shell ocorrerá, mas a divisão de palavras não ocorrerá. É a escolha certa aqui.