bom, primeiro de tudo tem que diferenciar o que eh caractere reservado de caractere nao reservado. a linguagem C eh altamente simbologica, entao muitos caracteres sao reservados: parenteses, colchetes, chaves, operadores aritmeticos, logicos, etc.
em particular, os caracteres A-Z, a-z e _ nao sao reservados para nada. isso significa que vc pode usar eles livremente em nomes de funcoes e variaveis. em especial, nao existe nenhuma restricao quanto ao uso de _ no comeco, meio ou fim de um nome! como _ nao tem diferenca especial de qq outro caractere, usar _314 ou X314 para diferenciar do numero 314 dah absolutamente na mesma.
bom, isso eh a posicao oficial. agora tem a parte extra oficial que muda consideravelmente as coisas: a tradicao.
a linguagem C eh relativamente moderna, surgiu em minicomputadores. mas muitas outras linguagens anteriores surgiram na epoca do cartao perfurado, onde nao era possivel diferenciar maiusculas de minusculas. assim, adicionava-se _ para melhorar a legibilidade, de modo que ENDOFFILE tornava-se END_OF_FILE.
a linguagem C nao possui essa restricao, mas na decada de 70 a tradicao falou mais forte e a notacao tradicional end_of_file ou END_OF_FILE era muito mais popular do que EndOfFile.
outro ponto onde a tradicao pegou foi na linkagem: como era muito comum a colisao de simbolos do assembler com os simbolos da linguagem de alto nivel, adotou-se como pratica a adicao de _ na frente dos simbolos gerados pelo compilador. ateh hoje muitos compiladores adotam essa pratica e muitos sistemas operacionais impoe o uso dessa notacao. pelo mesmo motivo, usou-se a tradicao para evitar outras colisoes e hoje temos aberracoes estranhas como as diretivas __TIME__ e __DATE__, adicionadas ao pre-processador por algum fundamentalista do cartao perfurado.
eh claro que a tradicao nem sempre manda: o gcc por exemplo eh um compilador que nao adiciona _ na frente dos simbolos e isso facilita muito a vida. ao contrario do que se supoe, a colisao de simbolos entre codigo assembler e codigo compilado normalmente eh o que se deseja! e mesmo o unix, na decada de 70, nao adotou a forma tradicional de se escrever end of file: ao inves de EndOfFile, END_OF_FILE ou end_of_file, usou-se a enigmatica sigla EOF
