The main entry point is God. Be it a C or C++ source file, it is the center of the application.
Apenas da mesma forma que o nitrogênio é o centro de um pinheiro . É onde tudo começa , mas não há nada sobre C ou C ++ que faça você colocar o "centro" da sua aplicação em main()
.
Muitos programas C e C ++ são criados em um loop de eventos ou em um I / O pump . Esses são os "centros" de tais programas. Você nem precisa colocar esses loops no mesmo módulo como main()
.
Not only do I want the main entry point to be the first thing that is executed, I also want it to be the first thing that is compiled.
Na verdade, é mais fácil colocar main()
último em um arquivo de origem C ou C ++.
C e C ++ não são como alguns idiomas, onde os símbolos podem ser usados antes de serem declarados. Colocar main()
primeiro significa que você declara para frente todo o resto.
There was a time when proprietary and closed-source libraries were common. Thanks to Apple switching to Unix and Microsoft shooting themselves in the foot, that time is over.
" Diga-me que está sonhando! "
OS X e iOS estão cheios de código proprietário, e a Microsoft não irá embora em breve.
O que as dificuldades atuais da Microsoft têm a ver com a sua pergunta? Você diz que pode querer criar DLLs e menciona a incapacidade do Automake de lidar efetivamente com o Windows. Isso me diz que a Microsoft continua relevante em seu mundo também.
Static linking is a real bitch.
Realmente? Eu sempre achei mais fácil do que vincular a bibliotecas dinâmicas. É uma tecnologia mais antiga e simples, com menos coisas para dar errado.
Vinculação estática incorpora as dependências externas no executável, de modo que o executável permaneça sozinho, autocontido. Do restante da sua pergunta, isso deve agradar a você.
you can #include the libraries as headers
Não ... Você #include
cabeçalhos da biblioteca , não bibliotecas.
Isso não é apenas pedantismo. A terminologia é importante . Tem significado.
Se você pudesse usar #include
libraries, #include </usr/lib/libfoo.a>
funcionaria.
Em muitas linguagens de programação, é o modo como as referências externas a módulos / bibliotecas funcionam. Ou seja, você faz referência ao código externo diretamente.
C e C ++ não estão entre as linguagens que funcionam dessa maneira.
If the C library wasn't designed to conform to C++'s syntax, you're screwed.
Não, você só precisa aprender a usar o C ++. Especificamente, aqui, extern "C"
.
How might I write such a thing in preprocessor lingo?
É perfeitamente legal para #include
outro arquivo C ou C ++:
#include <some/library/main.cpp>
#include <some/other/library/main.c>
#include <some/other/library/secondary_module.c>
#include <iostream>
int main()
{
call_the_library();
do_other_stuff();
return 0;
}
Nós não usamos extern "C"
aqui porque isto extrai o código C e C ++ dessas outras bibliotecas diretamente para o nosso arquivo C ++, então os módulos C precisam ser legais também. Há um número de pequenas diferenças entre C e C ++ , mas se você vai misturar duas línguas, você terá que saber como lidar com elas de qualquer maneira.
Outra parte complicada de fazer isso é que a ordem do #includes
é mais sensível que a ordem das referências da biblioteca se um comando do vinculador. Quando você ignora o vinculador dessa forma, acaba tendo que fazer algumas coisas manualmente que o vinculador faria de outra forma para você automaticamente.
Para provar isso, eu peguei MiniBasic (seu próprio exemplo) e converti sua% programa de driverscript.c
para um programa C ++ autônomo que diz #include <basic.c>
em vez de #include <basic.h>
. ( patch ) Apenas para provar que é realmente um programa em C ++ agora, mudei todas as chamadas printf()
para cout
stream insertions. / p>
Eu tive que fazer algumas outras mudanças, todas bem dentro de um dia de trabalho normal para alguém que vai misturar C e C ++:
-
O código MiniBasic faz uso da disposição de C para tolerar conversões automáticas de
void*
para qualquer outro tipo de ponteiro. C ++ faz com que você seja explícito. -
Novos compiladores não estão mais tolerando o uso de constantes de string C (por exemplo,
"Hello, world!\n"
) emchar*
contextts. O padrão diz que o compilador tem permissão para colocá-los em memória somente leitura, então você precisa usarconst char*
.
É isso. Apenas alguns minutos de trabalho, corrigindo reclamações do GCC.
Eu tive que fazer algumas alterações semelhantes em basic.c
àquelas no arquivo de patch script.c
vinculado. Eu não me importei em postar os diffs, já que eles são mais do mesmo.
Para outra maneira de fazer isso, estude a Mistura de SQLite , em comparação com a árvore de fontes do SQLite . O SQLite não usa #include
todos os outros arquivos em um único arquivo mestre; eles são, na verdade, concatenados juntos, mas isso também é tudo que o #include
faz em C ou C ++.