Programação moderna em C - Aula 1: Funções main() e printf()
ฝัง
- เผยแพร่เมื่อ 28 ธ.ค. 2024
- Na primeira aula, começamos do começo: a função main. Concentramos esta aula na explicação do esqueleto de um programa em C.
Esqueceu de prepara o ambiente? Dá uma olhada na Aula 0: Preparando o Ambiente • Programação moderna em... - não deixe de assistir!
Dúvidas? Poste nos comentários!
-Conteúdo:
Fernando Mercês (@MercesFernando)
-Revisão técnica:
Leonardo Sena (@slayer_owner)
Otávio Augusto (@otavioarj)
-Edição e capa:
Paulo Arruzo (@pauloarruzzo)
Comecei a acompanhar o curso e já na segunda aula fiquei impressionado com tantas coisas legais que foram mostradas e que nunca vi em nenhum curso dito profissional.
Parabéns.
Vou fazer alguns testes para prosseguir com a novas aulas.
Puta que pariu, irmão. Esse curso é foda pra caralho. Não tive nenhuma aula de algorítmos com NADA disso, com professores phd em arrombação na casa do caralho.
Essa aula abriu muito a minha mente e olha que eu já to há 2 ano conhecendo a área. Aqui podemos ver como o C de faculdade é superficial. Fiz o que você disse e passei algumas horas na documentação do printf e aprendi muita coisa e como funciona fprintf, sprintf, etc.. Obrigado msm, de coração
Que feedback incrível, Matheus! É exatamente o que queremos que aconteça. 💚
@@mentebinaria Eu sou o tipo de pessoa que não gosta de ir pra níveis mais altos sem saber o porquê deles existirem. Então eu to querendo meio que "resetar" a minha mente e descer níveis pra entender melhor as coisas. O que eu, querendo ser um programador de verdade, e de verdade eu não digo só aprendendo o superficial de uma linguagem, indo pra framework, fazer crud's e SPA's e já achar que sei programar, quero aprender de verdade. O que vc recomenda como base essencial? Abraços
do geito que vc explica uma criança de 3 anos aprende C.
parabens Fernando!
Colega. Sem faltar com respeito: Jeito... Isso em entrevista de emprego é determinante.
Didática incrível, parabéns mais uma vez, Mercês.
Muito bom!! Melhor curso de C que eu já estudei! Tava procurando um assim bem raiz mesmo, direto no shell.
Só tenho a agradecer pela sua iniciativa e por você estar compartilhando o seu conhecimento. Andei batendo muito a cabeça por ai, e sangrei de ler para aprender C raiz no shell e vim. Seu curso é Top. Eu te agradeço.
Não tem como não gostar de suas aulas! Simplesmente fantásticas!
Muito obrigado por compartilhar seus conhecimentos.
Muito obrigado, Fernando.
De nada 🙏
E lá vamos nós 🙏
Caraca, é muita coisa nova em uma aula só hahaha
Esse curso é muito bom! Parabéns! Tem quase 1 ano que estou programando em C e aqui pude ver algumas técnicas que pode me ajudar muito e já elucidei algumas dúvidas que eu tinha tanto em C quanto em Shell!
você é mt bom cara, sou iniciante na programação e decidi aprender C, cntg ta sendo muito maneiro
Boa essa aula.
Caramba, to impressionado com o echo, que comando maravilhoso
né? 🙂
Olá, tudo bem? Espero que sim. Estou super adorando tuas vídeo-aulas, são excelentes, ainda mais que traz muitas dicas, também, de VI. Parabéns!
O cara não apenas entrega conteúdo, ele entrega um conteúdo já MASTIGADO. Pra entender só precisa, no mínimo, ter UM ouvido e saber LER. Kkk
Cada vídeo melhor, com certeza farei o curso até o final !!
Valeu mercês não para não pelo amor de deus vlww
Se não for uma, mas a melhor aula de C que eu já acompanhei.
Show de bola esse curso!!! To querendo entender do kernel do linux.
Cara você esta de parabéns, sua didática é ótima, e com excelente dicas. TOP Total!!!
Obrigado.
Uma dúvida recorrente (me perguntam muito isso) é sobre o conteúdo dos arquivos de cabeçalho (headers ou .h)... Acho importante dizer que eles NÂO SÃO BIBLIOTECAS.
Claro... assumo que você vai falar mais disso quando introduzir o conceiro de declaração versus definição...
[]s
Headers são arquivos onde ficam escritos os protótipos das funções, ou seja, criamos um arquivo.c com as funções que queremos e depois criamos um arquivo.h onde ficam o protótipo dessas funções do arquivo.c. Para mais entendimento : www.cprogressivo.net/2013/09/Header-cabecalho-o-que-sao-para-que-servem-como-criar-e-usar-seus-arquivos-.h.html
Explicação básica. Mas sim em termos gerais muitos se referirão a eles como bibliotecas
De fato ouço muito que os headers são bibliotecas. Importante ressaltar que não são.
Opa! segunda aula assimilada! que venha a próxima!
Parabéns pela excelente iniciativa, sei programar em Python e estava começando a pesquisar sobre C, vou começar a acompanhar. Ótima didática!
Muito maneiro cara!
Show de bola
Ótimo curso cara! Muito claro, abrangente: aprendo linux, vim, c, etc. Parabéns e muito obrigado.
Dizem que é boa prática nunca usar e sempre usar "stdio.h", não lembro exatamente o problema relacionado, mas atualmente a forma com aspas para headers padrão são normalmente aceitos pelo compilador, então abandonei os .
Parabéns Fernando !!!
Muito bom, seus dois últimos vídeos de programação não apenas abordou o uso do vim que é um editor que tenho bastante interesse como futuro developer como também incentivou bastante a minha pessoa a querer reaprender a linguagem criada pelo grande e já falecido Dennis Ritchie.
to maratonado o c ta bem legal o conteudo, é bacana percebe q coisas do c tipo o
são usadas e muitas linguagens
Ah... Obrigado pela dica da exclamação na frente! Eu usava o Ctrl+R para buscar os últimos comandos executados.
Muito boa aula! Hands on total!
nossa vc explicou tintin por tintin, estou adorando este curso
Aula incrível, estava buscando algo assim. Programação o mais próximo do shell. Excelente curso.
Obrigado 😊
Estou na espera da proxima aula :3
Eu to revendo os videos pq tem muito conte[udo pra fixar. C é foda.
a função main() só não executada quando a chamada parte da bios, gerenciadores de boot e onit de OS quando escrito e C não usa o main() mais sim é executado um jump para a execução do registrador apontado por si.
no numaboa.com.br explica esses tipo de tratamento, que foi o local que lembro de ter lido sobre essa excessão.
Excelente curso !
Muito boa as aulas Mendes(isso pq estou na segunda ahaha), eu não sei nada de C e tava querendo usar o VIM para programa com ele e encontro uma playlist com tudo isso e uma otima didatica, muito obrigado por compartilhar o conhecimento e seu tempo com essas videos aulas.
muito bem explicado, parabéns, ótima didática
Um lugar bacana para olhar também é o "Exploit Database", dá pra puxar muita coisa de lá.
Muito boa a iniciativa de dar um curso de linguagem C aqui no TH-cam. Continue com os vídeos!
Quanto à função main(), de acordo com a especificação mais atual da linguagem C (ISO/IEC 9989:201x -- open-std.org/JTC1/SC22/WG14/www/docs/n1570.pdf , página 31), ela é o ponto de entrada de todo programa escrito em C. Essa característica pode ser alterada caso o compilador utilizado permita, mas esse não é o comportamento padrão da linguagem.
Existe um macete para que o programa pareça não estar iniciando pela função main, que é usar a diretiva de pré-processamento #define para criar um apelido para ela.
#define entry main
int entry(void) { ... }
Curiosidade: em C++ construtores de objetos podem ser executados antes da chamada à função main().
Então, mas concorda que ela ainda não foi alterada? No final ela está como "main()" de qualquer maneira. Pode ser comprovado quando for feito o disassemble. Por exemplo:
$ objdump -d prog | awk -v -RS= '/^[[:xdigit:]].*/'
E você verá ambos símbolos: "main" e "_start". Ou seja, o "main()" só não foi escrito na maneira tradicional:
int main(void)
Mas foi escrito de outra forma, através de diretivas:
#define whatever main
Para manipular o entry point pode ser escrito algo do tipo:
void _start(void)
{
// alguma coisa
}
E na hora da compilação usar a flag "-nostdlibs" ou "-nostartfiles" (dependendo da ocasião), quando for buscar a função "main"...
$ gdb prog -batch -ex 'disas main'
Provavelmente não terá o output desejado, com uma mensagem dizendo que nenhum símbolo pôde ser carregado. Pois, óbvio, o "main" não foi definido desta vez.
Essa sua técnica também se aplica quando tu gera um object file ao invés do binário direto e aplica o objcopy para mudar o entry point:
$ objcopy --redefine-sym whatever=main prog.o
Por fim, compila para gerar o binário... o "main" ainda estaria lá.
Contudo, volta ao que o Fernando Mercês havia falado: Nunca vi um programa C sem a função main.
Outra maneira legal, só que é mais criativa... eu já usei para "renomear" a syscall write:
#define reigns(r,a,I,N,i,n,g,b,l,O,o,d,y) i##g##o##I##N
#define sl4y3r reigns(h,a,t,e,w,o,r,l,d,W,i,d,E)
Nisso... ao invés de eu escrever "write", escrevo "sl4y3r".
Tô ligado que isso ficou uma merda, é um poc antigo que tenho no gist há 10 meses atrás e mostrei o trecho que interessa.
Tem um outro jeito que faz com que a main() não seja nem criada. É só redefinir a função _start() e compilar com o parâmetro -nostartfiles do gcc.
#include
#include
int custommain(void)
{
puts("Programa em C sem a função main()");
return 0;
}
void _start()
{
int ret = custommain();
exit(ret);
}
Compilar com: gcc -o sem_main sem_main.c -nostartfiles
Obviamente, não dá pra usar esse artifício em qualquer programa, já que _start() está sendo redefinido.
As aulas são muito boas
Exelente didática
Excelente aula!
sim no kali 202.1 nao tem calculadora bc?
Deve ter, porque Kali descende do Backtrack, que descende do Debian. Mas se não tiver, use o comando
sudo apt install bc.
Acho que o Kali não necessita o sudo porque o usuário já opera como root.
Que aula f*%#, parabéns
parabenx excele aula amigo
Obrigado ☺️
Caramba cara, tua aula equivale a umas 10 de outros cursos de C por aí!
🥹
parabéns pela aula, a didática é muito boa mesmo, gostei muito deste curso.
só fiquei com uma duvida, a função main, precisa ter o argumento void dentro do parêntesis?, eu já programei vários exercícios sem colocar o void dentro da função main, qual é a utilidade?
Muito obrigado! Precisar não precisa, mas é mais correto. Isso porque quando você declara uma função assim(), tá dizendo ao compilador que essa função pode ser chamada com qualquer número de argumentos. Logo, uma chamada assim(3, 4, “lala”) compila.
Já quando você especifica com void que a função não recebe argumentos assim(void), o compilador emitirá um erro caso tenta chamar a função assim(“lala”, 3...) ou qualquer número de argumentos maior que zero. O único jeito certo de chamar a função é assim().
Se curtir a comunidade, considera se cadastrar em menteb.in e menteb.in/discord - tem muita discussão legal sobre C lá. ☺️
Abraço!
@@mentebinaria obrigado pela resposta, vou entrar nesses links que mandou.
abraço
Podia ter uma aula sobre expressões regulares em c
Expressões regulares é um assunto que precisa de atenção na Internet, pois realmente não tem muita coisa.
Professor, excelente aula! Fiquei com uma dúvida, entretanto. Pq o retorno '0' da função saiu como true? Pq pelo que entendi, o echo só será executado após o && se o primeiro comando retornar true. Mas pensava que para isso ocorrer, era necessário retornar '1'. Pensei errado?
Obrigado!!
Como é uma convenção retornar 0 em execuções bem-sucedidas, creio que nessa situação em específico 0 é considerado true.
Mas eu também fiquei na dúvida, inclusive, se trocar && por ||, a mensagem não é impressa, sendo que em expressões relacionais com ||, pelo menos uma condição precisa ser verdadeira.
Demorei a responder, sorry. Mas sim, na convenção do SO o 0 é uma execução sem erros. Qualquer outra coisa é falha, na maioria das arquiteturas. Isso é para o SO, para ser usado com a função exit(), no caso, exit(0) ou exit(EXIT_SUCCESS) e exit(1) ou exit(EXIT_FAILURE).
Continuando… um return 0 no final da main é o mesmo que chamar exit(0), ou seja, encerra o programa com um código de erro para o SO saber se a execução foi bem sucedida ou não. Isso é uma convenção “fora” da linguagem da C. É no SO! 😉
No shell do Unix/Linux o comando depois do && será executado se o comando anterior *for executado com sucesso, ou seja, retornar EXIT_SUCCESS, que é 0*. Acho que vou fazer um vídeo pra explicar isso melhor. ☺️
estou com duvida sobre a ordem em q é lido o comando, o ret inicialmente era 0 e depois ele atribuiu o printf e imprimiu no mesmo instante ou terminou de ler todo o codigo para soltar os print ? na hora q imprimiu o ret ele ja era int ?
A linguagem C é compilada, então primeiro seu arquivo.c é compilado(transforma todo código fonte(texto que vc escreveu) em código de máquina(executável)), na primeira aula ele mostrou o comando: file hello* , que mostrou a diferença entro o código fonte e executável. Ou seja, ele lê tudo e depois executa(printa).
Algumas notas sobre a aula:
- não precisa escrever o "return 0;" pode ser escrito como return EXIT_SUCCESS;
- não precisa colocar o void dentro do int main();
- e o comando "hd" não existe no fedora, você terá de escrever "hexdump -C", caso não tenha o pacote instalado, dê o comando "sudo yum install util-linux" ou "sudo dnf install util-linux" para ser possível usar o comando.
Uma boa aula Fernando!
Uso Fedora 31, procurei man hd e apareceu coisas sobre hard disc. Em man hexdump tem bastante informação.
Gosto de usat EXIT_SUCCESS no return no final do código em C e EXIT_FAILURE dentro do exit(). Mas é interessante lembrar de incluir a stdlib.h para isso.
Curiosidades:
No padrão POSIX (capítulo 3, versículo 206! kkkkkkkkkkkk), quando uma linha não termina com uma '
' (newline), o mesmo não é considerado uma linha. Neste caso, é por isso que alguns arquivos de configuração quando não há uma linha extra, pode dar merda ou até mesmo nem ser executada. Devido à isto, quando fechar a função principal, "deve" adicionar a linha extra:
1. #include
2. int main(void)
3. {
4. puts("mente binaria");
5. }
6.
~
Eu, particularmente, nunca tive problemas disso por compilação, provavelmente o compilador faz um bom trabalho quanto à isso. Por outro lado, é normal isso dar merda nas demais manipulações de textos diretos do (ba)sh. Por isso que classifiquei como um tipo de "curiosidade", as demais definições de POSIX Standards" podem ser vistas em:
(3.206:pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_206)
E aos manolos que vão começar a utilizar o "man page", o comando '-k' é bem útil. ahuahauahuah
(Se tiver no Linux)
$ mandb -c # para carregar/atualizar a db
$ man -k printf # fazer a busca
Uma coisa legal também é que... os compiladores de C++ não compilam quando não encontram a declaração da função. Ao contrário dos compiladores C, que gera uma "declaração implicita"
, um arquivo objecto... e no momento em que o código for linkado, trazendo a biblioteca padrão, o compilador verá essa declaração implítica com a função (ex: printf, que faz parte da biblioteca padrão [glibc]) e, finalmente (mesmo obtendo algumas mensagens de atenção do GCC: "Warning:"), conseguirá uma declaração explícita.. tornando o código funcional como se tivesse adicionado a diretiva para stdio.h!
Ah... Esqueci de mencionar, quando você disse sobre o retorno ser 0 (zero), significa que o programa rodou corretamente. Mas olhe só que maneiro quando retiramos o "return 0;"
--------- hello.c ---------
#include
int main(void)
{
printf("mentebinaria.com.br
");
}
Se compilar no padrão C99:
$ gcc -std=c99 -o hello hello.c
O programa vai rodar, e quando olhar o retorno, ele realmente irá mostrar um zero, porque na definição o "exit" de C99 torna zero quando sucedido.
Mas se compilar no padrão C89, o retorno não será zero. Vejamos:
$ gcc -std=c89 -o hello hello.c
$ !.
./hello
mentebinaria.com.br
$ !echo
echo $?
19
Esse 19 é justamente os 19 caracteres (não incluindo o "new line", lógico) contidos no printf! :)
$ !. | wc -c
./hello | wc -c
19
Ou seja, isso inclui até nas definições de C K&R (Kernighan & Ritchie) e C ANSI.
Isso acontece porque o retorno está implícito, então quando um registrador retorna um valor, nas definições antigas -- citadas acima -- imprime um valor, do qual seria o "garbage value". Já as definições mais "modernas" imprime de acordo com o comportamento da execução do programa.
como C++ foi padronizado em 1998... provavelmente deve acontecer a mesma coisa! Porém ao invés de ser C99, em C++ seria o C++98!
Valeu Slayer, to curtindo muito os teus comentários, não para não por favor.
Tem alguma sugestão do que fazer pra entender um pouco mais sobre os compiladores c99, c89, clang e gcc além de ler manual? obrigado brother
Mencionando outra parada, essa eu tenho aprendido por causa do Frederico Pissarra, dele ter mostrado como listar as macros com o gcc:
$ gcc -E -dM < /dev/null
Por conta disso tinha pesquisado um pouco sobre essas flags e acabei aprendendo essa:
$ gcc -v -E -
Eita... valeu manolo!
Então cara, acredito que não tenha segredos... mas uma coisa que eu tenho costume que pode diferenciar de alguns é de ler documentações antigas. As vezes vejo algumas referencias que só consigo acessar a tal doc via "web.archive.org".
Confesso que eu não li inteiro o manual do GCC e de nenhum outro compilador é gigante e, abordam muitas coisas que eu não estou afim de saber no momento -- porque certas coisas sai do escopo do estudo.
Por outro lado, eu procuro ler sobre essas definições[1][2][3] e a história por trás... não priorizo, mas leio em algum momento que eu estou incapaz de estudar algo técnico (ex: no ônibus). Durante a pesquisa de alguma coisa sobre o compilador, a maioria das vezes eu caio no grupo do google[4] e fico lendo até o final, para saber até onde foi a discussão.
[1] C11: open-std.org/JTC1/SC22/WG14/www/docs/n1570.pdf -- Já foi mencionado aqui pelo Francivan Bezerra. E nesse mesmo link tem os demais:
** C99: www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf
[2] pubs.opengroup.org/onlinepubs/9699919799/ -- mencionei esse também
[3] C89/C90: read.pudn.com/downloads133/doc/565041/ANSI_ISO%2B9899-1990%2B[1].pdf
E de bônus, tem esses links:
port70.net/~nsz/c/
clc-wiki.net/wiki/C89
Apesar de eu ter caído nesses grupos quando faço as pesquisas, eu não faço parte de nenhum deles. Então, eu não acompanho a lista eu só leio até aonde a discussão vai... mas caso esteja curioso quais são essas listas:
[4] com.lang.c
groups.google.com/forum/#!forum/comp.lang.c
** comp.lang.c++
groups.google.com/forum/#!forum/comp.lang.c++
** comp.os.linux
groups.google.com/forum/#!forum/comp.os.linux
** comp.std.c
(Inclusive, uma pergunta recente é se ainda vale a pena estudar C K&R... pra quem está buscando aprender C, acho legal dar uma lida nessa lista)
groups.google.com/forum/#!topic/comp.std.c/gMPbDvlF30o
Como pode ter percebido, eu não tenho um lugar fixo, vou sempre pegando algum link de referencia. Ah.. também tem um lugar muito maneiro que chama-se "Linux Documentation Project".
E fora todos esses aí... ainda tenho o costume de pesquisar no Quora, porque lá você pode ter a visão mais "confiável". Por exemplo, se você ir lá e perguntar sobre kernel linux, capaz do Robert Love te responder (ele é quem escreveu um monte de livros sobre Kernel Development e Linux in a nutshell).
Muito bom. Obrigado.
Mercês, qual pacote tem o programa "hd" ?
e o pacote hexdump
Um outro pacote que pode te interessar é o 'ht'.
No antigo DOS eu usava um programinha chamado HACKER'S VIEW... esse é o mesmo cara... Execute-o com 'hte '.
O HIEW (Hacker's View) ainda é mantido e muito usado na indústria de segurança. É pago.
O HT Editor (hte) não é o mesmo, mas se parece de fato. É livre. ;-)
Kra, eu nunca programei na minha vida, o que voce recomenda para começar a aprender?
Canal Piovesan Assista todos os vídeos deste Canal em C, te garanto que depois disso, aprender qualquer linguagem se tornará mais fácil pra você!
Como e que sais do Vim? Tens sempre de digitar ':' + 'x' + 'enter'? Ou ha uma maneira mais facil (como e o caso de python ctrl +D)?
Mr.Pablo de los Marbles x sai salvando, q sai, mas se tivsr alteração ele nn permite, então usa q!, e ele sai forçado, ou wq que é write quit
Desconheço outra forma, mas sou básico no vim
Mr.Pablo de los Marbles Da pra fazer mapeamento de teclado no arquivo .vimrc, colocando uma combinação de tecla no teclado, ou apenas uma única tecla, valendo como um comando.
Mas não me lembro como faz, pesquisa sobre como editar o .vimrc
A primeira vez que usei o VIM fiquei apavorado... depois desses vídeos to de boas. O poder do conhecimento ilumina :)
:x é a mais fácil. A outra é :wq pra gravar e sair, :q pra sair quando não houve alterações e :q! pra sair sem gravar.Pelo que entendi, você queria um comando sem uso de enter no final. VI é de outros tempos, sem interface gráfica.
Aula bem legal, só poderia usar um colorscheme um pouco mais legível no vi
O color scheme mais legal pra mim é o desert, que se não me engano, era o que estava sendo usado. Mas para ficar melhor no vídeo, creio que o murphy é mais interessante mesmo. Mas na utilização diária, é questão de gosto... hehe.
tem algum comando no terminal do opensuse equivalente ao "hd"?
Leandro Santos É só instalar o hd (hexdump)
Eu usei o o seguinte comando
Yay -S hxdump
Mas para isso tem que ter o yay instalado, tem vários tutorias na internet para isso
Quando eu dei echo após exibir o resultado do Hello, não apareceu nada, fui no vi e incrementei 1 , recompilei e não apareceu nada novamente. Estou usando o raspberry com raspian para acompanhar as aulas, será que o problema é com o meu sistema Linux que é diferente da VM utilizada na aula?
"echo" puro, sem o argumento "echo $?" \?
Sei que fazem 3 anos, mas tenho uma pergunta: algúem teria uma tabela com todos os operadores de saída % e seus significados ??
Vê se ajuda: en.wikipedia.org/wiki/Printf_format_string
@@mentebinaria obrigado!!
Todos os bons livros de programação em C têm essa tabela. The C Programming Language, por exemplo. O livro do Deitel, muito famoso, tem essa tabela. Mas a fonte mais completa e definitiva está nas man pages: é só digitar no terminal man 3 printf. No restante do curso o Mercês vai mostrar essa fonte.
Não me lembro bem onde aprendi isso, mas aprendi que o "programa mínimo" em C é main(){}., deixando que o compilador assuma o retorno como int e os parâmetros como void. Então creio que a piada esteja valendo... todo programa em C que se preza tem a função main... rsrsrs
vc abriu o manual do printf no console
~$ man 3 printf
mas de onde veio esse parâmetro 3? oque é esse 3? asdjkasdas
É o capítulo do manual. 😉
"man 3 " é para ver capítulo sobre funções da biblioteca padrão de C.
experimenta ver "man man" pra ver o que significa esse segundo parâmetro.
man é o paginador do manual do sistema Linux. Tem 9 capítulos e o capítulo 3 é dedicado às funções da linguagem C, que é nativa de todo sistema Unix-like (como o Linux).
Parabéns não >
Decepcionou...> :) Aprendir + nesta duas aulas do que lendo pdfs.
Maravilha, é um curso de C mas de brinde ganha-se um curso de Bash
Um pouco de tudo: C, bash, man pages, vim e assembly.
me ensina esse ssh linux ai no seu mac por favor
O macOS tem cliente SSH por padrão. Qual a dúvida? Ah, considera postar no fórum. É mais fácil por lá: menteb.in/forum
function! Executar(arq)
if &filetype == 'c'
:exec '!gcc -o /tmp/a.out' a:arq ';/tmp/a.out'
endif
endfunction
nnoremap :w :call Executar(shellescape(@%))
Achei esse script por aí nas interwebs. Ele compila o arq.c na pasta dos arquivos temporários e mapeia a tecla para disparar no modo de comandos do VIM(esc), é só você criar(se ainda não o tiver. dá um CTRL-H na pasta do seu usuario pra ver se o arquivo tá lá, pq ele é oculto) o arquivo .vimrc na sua home/seuusuario, e colar lá.
O universo conspira para não aprendermos C... Eu estava assistindo e apareceu um monte de anúncios de cursos de Python.
Quando ao main()... well... tem a porcaria do Windows (WinMain)... :)
muito boa essa aula... algo que pode completar e ajudar a entender o funcionamento das variáveis é o vídeo desse cara aki m.th-cam.com/video/FO9QJdMn-cw/w-d-xo.html