Как говорит Грег в комментарии, $$
расширится до PID оболочки, что не имеет смысла в контексте. Если это был один знак доллара или его не было, команду можно сократить до:
sed -i file.c -e "s/ __attribute__ ((__unused__))$/# ifndef __cplusplus\n&;\n# endif/"
, поскольку &
выдвигает то, что было сопоставлено между первой парой разделителей (в этом примере косые черты). Одиночный знак доллара приводит к тому, что сопоставление выполняется только в том случае, если строка находится в конце строки.