{"id":265,"date":"2026-03-04T01:54:46","date_gmt":"2026-03-04T01:54:46","guid":{"rendered":"https:\/\/hackcuba.net\/?p=265"},"modified":"2026-03-04T01:56:41","modified_gmt":"2026-03-04T01:56:41","slug":"secretos-de-c","status":"publish","type":"post","link":"https:\/\/hackcuba.net\/?p=265","title":{"rendered":"Secretos de C++"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\u00bfC\u00f3mo hacer que el C\/C++ no me de m\u00e1s errores de doble declaraci\u00f3n?<\/h2>\n\n\n\n<p>Hay un error en el mundo de la programaci\u00f3n en C++ que se hace muy com\u00fan, sobre todo cuando estamos programando orientado a objetos y tenemos distintos archivos para guardar las clases; pero <\/p>\n\n\n\n<!--more-->\n\n\n\n<p>cuando un archivo est\u00e1 incluido en 2 archivos cabecera (<em>.h<\/em>) y hay un tercero que contiene a los 2 \u00faltimos, \u00e9se puede contener clases doblemente definidas, debido a que como son muy utilizadas por otras (c\u00f3mo <code>TLista<\/code> para manejar listas de elementos), \u00e9stas aparecen declaradas en las que el tercero tiene incluidas en su cabecera, por lo que el compilador da el problema de doble declaraci\u00f3n. La situaci\u00f3n modelada es la siguiente:<a href=\"file:\/\/\/home\/h0ax\/Hacking%20&amp;%20Programacion\/Rebista%20BlackHat\/BlackHat%2016\/_imgs\/0x660018.png\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><\/p>\n\n\n\n<p>C\u00f3mo se ve en la figura, hay tres archivos que contienen a <em>TLista.h<\/em> y un tercero (Base de Camiones) que contiene a otros dos (<em>Camiones.h<\/em> y <em>Choferes.h<\/em>), que tambi\u00e9n tienen incluido a <code>TLista.h<\/code> en su cabecera, por lo que en <em>BaseCamiones.h<\/em> estar\u00e1 definido 3 veces, y eso da un error. El remedio para esta situaci\u00f3n es el siguiente:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Definir una variable que indique que el archivo est\u00e1 definido ya.<\/li>\n\n\n\n<li>Usar la directiva <code>#pragma once<\/code>.<\/li>\n<\/ul>\n\n\n\n<p>Ejemplo:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n #pragma once \/\/Cuando el compilador compila este archivo, no lo compila m\u00e1s cuando lo vea incluido en otros archivos, acelerando el procedimiento de compilaci\u00f3n.\n#if !defined(_VCL_ELIUX_TLISTA_HEADER_DEFINED851106_) \/\/Si esa constante no est\u00e1 definida (ocurre cuando no se ha agregado todav\u00eda el archivo), entonces\n#define _VCL_ELIUX_TLISTA_HEADER_DEFINED851106_ \/\/Define la constante en el compilador (para que no se agregue m\u00e1s)\ntemplate&lt;class tipo&gt; class TLista; \/\/Define la lista\n... \/\/Se implementa la clase\n#endif\n<\/pre><\/div>\n\n\n<p>Espero que a partir de ahora no cometan m\u00e1s errores de este tipo \ud83d\ude09<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfC\u00f3mo crear errores de prevenci\u00f3n en C\/C++?<\/h2>\n\n\n\n<p>En C++ hay una directiva que permite crear un error cuando se est\u00e1 compilando el programa si no se cumple una condici\u00f3n necesaria que permite garantizar la integridad del c\u00f3digo. Les mostrar\u00e9 de que se trata con un ejemplo:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n#ifndef __AFXWIN_H__\n#error include &#039;stdafx.h&#039; before including this file for PCH\n#endif\n<\/pre><\/div>\n\n\n<p>El c\u00f3digo anterior es muy usado en Visual C++ y sirve para garantizar que antes de que se incluya el actual archivo, se a\u00f1ade el que contiene la directiva (en este caso <em>stdafx.h<\/em>), que contiene la definici\u00f3n que indica que ya se compil\u00f3 ese encabezado.<\/p>\n\n\n\n<p>Salida:<br>Si el compilador compila el actual archivo (el que contiene el c\u00f3digo en vez de <em>stdafx.h<\/em>), el compilador reportar\u00e1 el error c\u00f3mo si hubiese ocurrido un error de c\u00f3digo y se mostrar\u00e1 el cartel: <em>\u201cinclude &#8216;stdafx.h&#8217; before including this file for PCH\u00bb<\/em>. Empiecen a usarlo y ver\u00e1n c\u00f3mo sus archivos no tendr\u00e1n m\u00e1s problemas de doble declaraci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Para saber m\u00e1s&#8230;<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"http:\/\/cprogramming.com\" target=\"_blank\" rel=\"noreferrer noopener\">C\/C++ Programming<\/a><\/li>\n\n\n\n<li><a href=\"http:\/\/www.lawebdelprogramador.com\" target=\"_blank\" rel=\"noreferrer noopener\">La Web del Programador<\/a><\/li>\n\n\n\n<li><a href=\"http:\/\/www.gruposyahoo.com.ar\/group\/DesarrolloC\" target=\"_blank\" rel=\"noreferrer noopener\">Desarrollo de Software en C\/C++<\/a><\/li>\n\n\n\n<li><a href=\"http:\/\/es.wikipedia.org\/wiki\/Bjarne_Stroustrup\" target=\"_blank\" rel=\"noreferrer noopener\">Bjarne Stroustrup<\/a><\/li>\n<\/ul>\n\n\n\n<p>Escrito por EliuX [<a href=\"mailto:aorozco@infomed.sld.cu\">aorozco@infomed.sld.cu<\/a>]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00bfC\u00f3mo hacer que el C\/C++ no me de m\u00e1s errores de doble declaraci\u00f3n? Hay un error en el<\/p>\n","protected":false},"author":2,"featured_media":266,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18,36],"tags":[60,58,38],"class_list":["post-265","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programacion","category-proyecto-blackhat","tag-c","tag-programacion","tag-proyecto-blackhat"],"_links":{"self":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/265","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=265"}],"version-history":[{"count":2,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/265\/revisions"}],"predecessor-version":[{"id":269,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/265\/revisions\/269"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/media\/266"}],"wp:attachment":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=265"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=265"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=265"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}