// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Trilha do Aprendizado de Aplicações em C/C++
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Trilha do Aprendizado de Aplicações em C/C++ - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Trilha do Aprendizado de Aplicações em C/C++


== Desenvolvendo Aplicações C, C++ e Fortran

Quando você instala o NetBeans IDE com suporte a C/C++, o IDE inclui tipos de projeto para C e C++ e modelos apropriados. Você pode criar aplicações em C, C++ e Fortran com bibliotecas dinâmicas e estáticas e também pode criar projetos C/C++/Fortran a partir dos códigos-fontes existentes. O editor recua, completa e realça a sintaxe do código C e C++ e é bem integrado com o depurador gdb do GNU.

== Conceitos Básicos 

* link:../../community/releases/80/cpp-setup-instructions.html[+Configurando o NetBeans IDE para C/C++/Fortran+]

== Tutoriais e Artigos

=== Criando Projetos em C e C++

* link:../docs/cnd/quickstart.html[+Tutorial para Início Rápido de Projetos em C/C+++]
* link:../docs/cnd/development-environment.html[+Definindo o Ambiente de Desenvolvimento de Projetos em C/C+++]
* link:../docs/cnd/beginning-jni-linux.html[+Introdução ao JNI com NetBeans IDE e Plug-in do C/C++ no Linux+]

=== Desenvolvendo Projetos C e C++

* link:../docs/cnd/navigating-editing.html[+Tutorial Editando e Navegando Arquivos de Códigos-Fonte C/C+++]
* link:../docs/cnd/debugging.html[+Tutorial Depurando projetos C/C+++]
* link:../docs/cnd/remote-modes.html[+Modos de Desenvolvimento Remoto de C/C+++]
* link:../docs/cnd/remotedev-tutorial.html[+Tutorial de Desenvolvimento Remoto C/C+++]
* link:../docs/cnd/c-unit-test.html[+Adicionando Testes de Unidade a um Projeto C/C+++]

== Tutoriais e Artigos

=== Como Fazer do Projeto C e C++

* link:../docs/cnd/HowTos.html[+Como fazer de Aplicações em C/C+++]
* link:../docs/cnd/depchecking.html[+Verificação da Dependência de Make+]
* link:../docs/cnd/toolchain.html[+Usando o Descritor de Coleção da Ferramenta C/C+++]
* link:../docs/cnd/cpp-vcs.html[+Armazenando Projetos do NetBeans C/C++ em VCS+]

== Documentos de Contribuição da Comunidade

* link:http://wiki.netbeans.org/HowToCreate64-BitC/C++WindowsProgramWithNetBeans[+Configurando o NetBeans IDE para Criar Executáveis do Windows C/C++ de 64 bits+]
* link:http://wiki.netbeans.org/Talk:HowToSetup64-BitQt5WithNetBeans7.4OnWindows[+Configurando Qt 5 de 64 bits no Windows para usar com o NetBeans IDE+]

== Outros Recursos

* link:../72/cnd/index.html[+Documentação C/C++ para Releases Anteriores+]
* link:http://wiki.netbeans.org/NetBeansUserFAQ#NetBeans_C.2FC.2B.2B_Development_Pack[+Perguntas Frequentes do Plug-in C/C++ do NetBeans+]
* link:https://netbeans.org/projects/cnd/lists[+Listas de Correspondência do C/C++ do NetBeans+]
