// 
//     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.
//

= Camí d'aprenentatge d'aplicacions C/C++
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Camí d'aprenentatge d'aplicacions C/C++ - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Camí d'aprenentatge d'aplicacions C/C++

== Desenvolupant aplicacions C i C++

Quant instal·leu l'IDE NetBeans amb suport C/C++, l'IDE inclou els tipus de projectes per a C i C++, així com les plantilles adequades. Podeu crear aplicacions C/C++ amb biblioteques estàtiques i dinàmiques, i també podeu crear projectes C/C++ des de fonts existents. El sagnat, el completament, i el ressaltat de la sintaxi per al codi en C i C++ en l'editor, està perfectament integrat amb el depurador GNU gdb.

En l'IDE NetBeans 6.8, noves característiques en C/C++ inclouen l'ús nou d'E/S i eines d'anàlisi de microestat en fils d'execució, millora en la còpia en projectes remots, millores en les eines d'anàlisis ja existents.

== Com començar 

* link:../../community/releases/71/cpp-setup-instructions.html[+ Configurant l'IDE NetBeans per a C/C++/Fortran+]

== Guies d'aprenentatge i Articles

=== Creant projectes C i C++

* link:../docs/cnd/quickstart.html[+Guia d'aprenentatge d'iniciació a projectes C/C+++]
* link:../docs/cnd/development-environment.html[+Definint el vostre entorn de desenvolupament de projectes C/C+++]
* link:../docs/cnd/beginning-jni-linux.html[+ Començant JNI amb l'IDE NetBeans 6.7 i l'extensió C/C++ en Linux+]

=== Desenvolupant projectes C/C++

* link:../docs/cnd/navigating-editing.html[+Guia d'aprenentatge de l'edició i navegació a fitxers font en C/C+++]
* link:../docs/cnd/debugging.html[+Guia d'aprenentatge de depuració de projectes C/C+++]
* link:../docs/cnd/remotedev-tutorial.html[+Desenvolupament remot C/C+++]

=== Com fer-ho en projectes C i C++

* link:../docs/cnd/HowTos.html[+Com fer-ho en aplicacions C/C+++]
* link:../docs/cnd/depchecking.html[+Fer la comprovació de dependències+]
* link:../docs/cnd/macro-features.html[+Explorant les Macros en projectes C/C+++]

== Documents aportats per la comunitat

* link:http://wiki.netbeans.org/CNDObservabilityTool[+Eines d'anàlisi per a la resolució de problemes+]
* link:http://wiki.netbeans.org/GtkApplicationInNetBeans[+ Aplicació GTK+ en NetBeans 6.0+]

== Altres recursos

* link:http://wiki.netbeans.org/NetBeansUserFAQ#section-CAndCPlusPlusFAQ-NetBeansCCPluginFAQAndHOWTOs[+PMFs complement C/C++ NetBeans+]
* link:https://netbeans.org/projects/cnd/lists[+Llistes de correu de NetBeans C/C+++]
