€•Œsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒEnglish”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ/process/coding-style”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Simplified)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/zh_CN/process/coding-style”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/zh_TW/process/coding-style”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/it_IT/process/coding-style”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/ja_JP/process/coding-style”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/ko_KR/process/coding-style”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒSpanish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒwarning”“”)”}”(hX?Si tiene alguna duda sobre la exactitud del contenido de esta traducciĂłn, la Ășnica referencia vĂĄlida es la documentaciĂłn oficial en inglĂ©s. AdemĂĄs, por defecto, los enlaces a documentos redirigen a la documentaciĂłn en inglĂ©s, incluso si existe una versiĂłn traducida. Consulte el Ă­ndice para mĂĄs informaciĂłn.”h]”hŒ paragraph”“”)”}”(hX?Si tiene alguna duda sobre la exactitud del contenido de esta traducciĂłn, la Ășnica referencia vĂĄlida es la documentaciĂłn oficial en inglĂ©s. AdemĂĄs, por defecto, los enlaces a documentos redirigen a la documentaciĂłn en inglĂ©s, incluso si existe una versiĂłn traducida. Consulte el Ă­ndice para mĂĄs informaciĂłn.”h]”hX?Si tiene alguna duda sobre la exactitud del contenido de esta traducciĂłn, la Ășnica referencia vĂĄlida es la documentaciĂłn oficial en inglĂ©s. AdemĂĄs, por defecto, los enlaces a documentos redirigen a la documentaciĂłn en inglĂ©s, incluso si existe una versiĂłn traducida. Consulte el Ă­ndice para mĂĄs informaciĂłn.”…””}”(hh©hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸŒ2Documentation/translations/sp_SP/disclaimer-sp.rst”h KhhŁubah}”(h]”h ]”h"]”h$]”h&]”uh1hĄhhhžhhŸh·h NubhŒ field_list”“”)”}”(hhh]”(hŒfield”“”)”}”(hhh]”(hŒ field_name”“”)”}”(hŒOriginal”h]”hŒOriginal”…””}”(hhÊhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÈhhĆhŸŒU/var/lib/git/docbuild/linux/Documentation/translations/sp_SP/process/coding-style.rst”h KubhŒ field_body”“”)”}”(hŒA:ref:`Documentation/process/coding-style.rst `”h]”hš)”}”(hhĘh]”h)”}”(hhĘh]”hŒinline”“”)”}”(hhĘh]”hŒ&Documentation/process/coding-style.rst”…””}”(hhçhžhhŸNh Nubah}”(h]”h ]”(Œxref”Œstd”Œstd-ref”eh"]”h$]”h&]”uh1hćhhâubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œ'translations/sp_SP/process/coding-style”Œ refdomain”hòŒreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆŒ reftarget”Œsubmittingpatches”uh1hhŸhŰh Khhßubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh KhhÛubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙhhĆubeh}”(h]”h ]”h"]”h$]”h&]”uh1hĂhŸhŰh KhhÀhžhubhÄ)”}”(hhh]”(hÉ)”}”(hŒ Translator”h]”hŒ Translator”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÈhjhŸhŰh KubhÚ)”}”(hŒ.Carlos Bilbao ”h]”hš)”}”(hŒ-Carlos Bilbao ”h]”(hŒCarlos Bilbao <”…””}”(hj-hžhhŸNh NubhŒ reference”“”)”}”(hŒcarlos.bilbao.osdev@gmail.com”h]”hŒcarlos.bilbao.osdev@gmail.com”…””}”(hj7hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œ$mailto:carlos.bilbao.osdev@gmail.com”uh1j5hj-ubhŒ>”…””}”(hj-hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Khj)ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1hĂhŸhŰh KhhÀhžhubeh}”(h]”h ]”h"]”h$]”h&]”uh1hŸhhhžhhŸhŰh KubhŒtarget”“”)”}”(hŒ.. _sp_codingstyle:”h]”h}”(h]”h ]”h"]”h$]”h&]”Œrefid”Œsp-codingstyle”uh1jch KhhhžhhŸhŰubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒ%Estilo en el cĂłdigo del kernel Linux”h]”hŒ%Estilo en el cĂłdigo del kernel Linux”…””}”(hjxhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhjshžhhŸhŰh K ubhš)”}”(hXdEste es un breve documento que describe el estilo preferido en el cĂłdigo del kernel Linux. El estilo de cĂłdigo es muy personal y no **forzarĂ©** mi puntos de vista sobre nadie, pero esto vale para todo lo que tengo que mantener, y preferirĂ­a que para la mayorĂ­a de otras cosas tambiĂ©n. Por favor, por lo menos considere los argumentos expuestos aquĂ­.”h]”(hŒ†Este es un breve documento que describe el estilo preferido en el cĂłdigo del kernel Linux. El estilo de cĂłdigo es muy personal y no ”…””}”(hj†hžhhŸNh NubhŒstrong”“”)”}”(hŒ **forzarĂ©**”h]”hŒforzarĂ©”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽhj†ubhŒÒ mi puntos de vista sobre nadie, pero esto vale para todo lo que tengo que mantener, y preferirĂ­a que para la mayorĂ­a de otras cosas tambiĂ©n. Por favor, por lo menos considere los argumentos expuestos aquĂ­.”…””}”(hj†hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh K hjshžhubhš)”}”(hŒ†En primer lugar, sugerirĂ­a imprimir una copia de los estĂĄndares de cĂłdigo GNU, y NO leerlo. QuĂ©melos, es un gran gesto simbĂłlico.”h]”hŒ†En primer lugar, sugerirĂ­a imprimir una copia de los estĂĄndares de cĂłdigo GNU, y NO leerlo. QuĂ©melos, es un gran gesto simbĂłlico.”…””}”(hjšhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Khjshžhubhš)”}”(hŒDe todos modos, aquĂ­ va:”h]”hŒDe todos modos, aquĂ­ va:”…””}”(hj¶hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Khjshžhubjr)”}”(hhh]”(jw)”}”(hŒ 1) SangrĂ­a”h]”hŒ 1) SangrĂ­a”…””}”(hjÇhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhjÄhžhhŸhŰh Kubhš)”}”(hXLas tabulaciones tienen 8 caracteres y, por lo tanto, las sangrĂ­as tambiĂ©n tienen 8 caracteres. Hay movimientos herĂ©ticos que intentan hacer sangrĂ­a de 4 (ÂĄo incluso 2!) caracteres de longitud, y eso es similar a tratar de definir el valor de PI como 3.”h]”hXLas tabulaciones tienen 8 caracteres y, por lo tanto, las sangrĂ­as tambiĂ©n tienen 8 caracteres. Hay movimientos herĂ©ticos que intentan hacer sangrĂ­a de 4 (ÂĄo incluso 2!) caracteres de longitud, y eso es similar a tratar de definir el valor de PI como 3.”…””}”(hjŐhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh KhjÄhžhubhš)”}”(hX"JustificaciĂłn: La idea detrĂĄs de la sangrĂ­a es definir claramente dĂłnde comienza y termina un bloque de control. Especialmente, cuando ha estado buscando en su pantalla durante 20 horas seguidas, le resultarĂĄ mucho mĂĄs fĂĄcil ver cĂłmo funciona la sangrĂ­a si tiene sangrĂ­as grandes.”h]”hX"JustificaciĂłn: La idea detrĂĄs de la sangrĂ­a es definir claramente dĂłnde comienza y termina un bloque de control. Especialmente, cuando ha estado buscando en su pantalla durante 20 horas seguidas, le resultarĂĄ mucho mĂĄs fĂĄcil ver cĂłmo funciona la sangrĂ­a si tiene sangrĂ­as grandes.”…””}”(hjăhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh KhjÄhžhubhš)”}”(hX@Bueno, algunas personas dirĂĄn que tener sangrĂ­as de 8 caracteres hace que el cĂłdigo se mueva demasiado a la derecha y dificulta la lectura en una pantalla de terminal de 80 caracteres. La respuesta a eso es que si necesita mĂĄs de 3 niveles de sangrĂ­a, estĂĄ en apuros de todos modos y deberĂ­a arreglar su programa.”h]”hX@Bueno, algunas personas dirĂĄn que tener sangrĂ­as de 8 caracteres hace que el cĂłdigo se mueva demasiado a la derecha y dificulta la lectura en una pantalla de terminal de 80 caracteres. La respuesta a eso es que si necesita mĂĄs de 3 niveles de sangrĂ­a, estĂĄ en apuros de todos modos y deberĂ­a arreglar su programa.”…””}”(hjńhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh K$hjÄhžhubhš)”}”(hŒĆEn resumen, las sangrĂ­as de 8 caracteres facilitan la lectura y tienen la ventaja añadida de advertirle cuando estĂĄ anidando sus funciones demasiado profundo. Preste atenciĂłn a esa advertencia.”h]”hŒĆEn resumen, las sangrĂ­as de 8 caracteres facilitan la lectura y tienen la ventaja añadida de advertirle cuando estĂĄ anidando sus funciones demasiado profundo. Preste atenciĂłn a esa advertencia.”…””}”(hjÿhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh K*hjÄhžhubhš)”}”(hXLa forma preferida de facilitar mĂșltiples niveles de sangrĂ­a en una declaraciĂłn de switch es para alinear el ``switch`` y sus etiquetas ``case`` subordinadas en la misma columna, en lugar de hacer ``doble sangrĂ­a`` (``double-indenting``) en etiquetas ``case``. Por ejemplo:”h]”(hŒpLa forma preferida de facilitar mĂșltiples niveles de sangrĂ­a en una declaraciĂłn de switch es para alinear el ”…””}”(hj hžhhŸNh NubhŒliteral”“”)”}”(hŒ ``switch``”h]”hŒswitch”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubhŒ y sus etiquetas ”…””}”(hj hžhhŸNh Nubj)”}”(hŒ``case``”h]”hŒcase”…””}”(hj)hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubhŒ5 subordinadas en la misma columna, en lugar de hacer ”…””}”(hj hžhhŸNh Nubj)”}”(hŒ``doble sangrĂ­a``”h]”hŒdoble sangrĂ­a”…””}”(hj;hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubhŒ (”…””}”(hj hžhhŸNh Nubj)”}”(hŒ``double-indenting``”h]”hŒdouble-indenting”…””}”(hjMhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubhŒ) en etiquetas ”…””}”(hj hžhhŸNh Nubj)”}”(hŒ``case``”h]”hŒcase”…””}”(hj_hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubhŒ. Por ejemplo:”…””}”(hj hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh K.hjÄhžhubhŒ literal_block”“”)”}”(hŒÖswitch (suffix) { case 'G': case 'g': mem <<= 30; break; case 'M': case 'm': mem <<= 20; break; case 'K': case 'k': mem <<= 10; fallthrough; default: break; }”h]”hŒÖswitch (suffix) { case 'G': case 'g': mem <<= 30; break; case 'M': case 'm': mem <<= 20; break; case 'K': case 'k': mem <<= 10; fallthrough; default: break; }”…””}”hjysbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”Œforce”‰Œlanguage”Œc”Œhighlight_args”}”uh1jwhŸhŰh K3hjÄhžhubhš)”}”(hŒTNo ponga varias declaraciones en una sola lĂ­nea a menos que tenga algo que ocultar:”h]”hŒTNo ponga varias declaraciones en una sola lĂ­nea a menos que tenga algo que ocultar:”…””}”(hjŽhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh KFhjÄhžhubjx)”}”(hŒ*if (condiciĂłn) haz_esto; haz_otra_cosa;”h]”hŒ*if (condiciĂłn) haz_esto; haz_otra_cosa;”…””}”hjœsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh KIhjÄhžhubhš)”}”(hŒ*No use comas para evitar el uso de llaves:”h]”hŒ*No use comas para evitar el uso de llaves:”…””}”(hj«hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh KNhjÄhžhubjx)”}”(hŒ.if (condiciĂłn) haz_esto(), haz_eso();”h]”hŒ.if (condiciĂłn) haz_esto(), haz_eso();”…””}”hjčsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh KPhjÄhžhubhš)”}”(hŒ1Siempre use llaves para mĂșltiples declaraciones:”h]”hŒ1Siempre use llaves para mĂșltiples declaraciones:”…””}”(hjÈhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh KUhjÄhžhubjx)”}”(hŒ:if (condiciĂłn) { haz_esto(); haz_eso(); }”h]”hŒ:if (condiciĂłn) { haz_esto(); haz_eso(); }”…””}”hjÖsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh KWhjÄhžhubhš)”}”(hŒ‰Tampoco ponga varias asignaciones en una sola lĂ­nea. El estilo de cĂłdigo del kernel es sĂșper simple. Evite las expresiones engañosas.”h]”hŒ‰Tampoco ponga varias asignaciones en una sola lĂ­nea. El estilo de cĂłdigo del kernel es sĂșper simple. Evite las expresiones engañosas.”…””}”(hjćhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh K^hjÄhžhubhš)”}”(hŒŁAparte de los comentarios, la documentaciĂłn y excepto en Kconfig, los espacios nunca se utilizan para la sangrĂ­a, y el ejemplo anterior se rompe deliberadamente.”h]”hŒŁAparte de los comentarios, la documentaciĂłn y excepto en Kconfig, los espacios nunca se utilizan para la sangrĂ­a, y el ejemplo anterior se rompe deliberadamente.”…””}”(hjóhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh KbhjÄhžhubhš)”}”(hŒOConsiga un editor decente y no deje espacios en blanco al final de las lĂ­neas.”h]”hŒOConsiga un editor decente y no deje espacios en blanco al final de las lĂ­neas.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh KfhjÄhžhubeh}”(h]”Œsangria”ah ]”h"]”Œ 1) sangrĂ­a”ah$]”h&]”uh1jqhjshžhhŸhŰh Kubjr)”}”(hhh]”(jw)”}”(hŒ%2) Rompiendo lĂ­neas y strings largos”h]”hŒ%2) Rompiendo lĂ­neas y strings largos”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhjhžhhŸhŰh Kjubhš)”}”(hŒ{El estilo de cĂłdigo tiene todo que ver con la legibilidad y la mantenibilidad usando herramientas disponibles comĂșnmente.”h]”hŒ{El estilo de cĂłdigo tiene todo que ver con la legibilidad y la mantenibilidad usando herramientas disponibles comĂșnmente.”…””}”(hj(hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Klhjhžhubhš)”}”(hŒIEl lĂ­mite preferido en la longitud de una sola lĂ­nea es de 80 columnas.”h]”hŒIEl lĂ­mite preferido en la longitud de una sola lĂ­nea es de 80 columnas.”…””}”(hj6hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Kohjhžhubhš)”}”(hŒ«Las declaraciones de mĂĄs de 80 columnas deben dividirse en partes, a menos que exceder las 80 columnas aumente significativamente la legibilidad y no oculte informaciĂłn.”h]”hŒ«Las declaraciones de mĂĄs de 80 columnas deben dividirse en partes, a menos que exceder las 80 columnas aumente significativamente la legibilidad y no oculte informaciĂłn.”…””}”(hjDhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Kqhjhžhubhš)”}”(hŒÄLos descendientes siempre son sustancialmente mĂĄs cortos que el padre y se colocan sustancialmente a la derecha. Un estilo muy usado es alinear descendientes a un parĂ©ntesis de funciĂłn abierto.”h]”hŒÄLos descendientes siempre son sustancialmente mĂĄs cortos que el padre y se colocan sustancialmente a la derecha. Un estilo muy usado es alinear descendientes a un parĂ©ntesis de funciĂłn abierto.”…””}”(hjRhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Kuhjhžhubhš)”}”(hŒ`Estas mismas reglas se aplican a los encabezados de funciones con una larga lista de argumentos.”h]”hŒ`Estas mismas reglas se aplican a los encabezados de funciones con una larga lista de argumentos.”…””}”(hj`hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Kyhjhžhubhš)”}”(hŒ‡Sin embargo, nunca rompa los strings visibles para el usuario, como los mensajes printk, porque eso rompe la capacidad de grep a estos.”h]”hŒ‡Sin embargo, nunca rompa los strings visibles para el usuario, como los mensajes printk, porque eso rompe la capacidad de grep a estos.”…””}”(hjnhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh K|hjhžhubeh}”(h]”Œ!rompiendo-lineas-y-strings-largos”ah ]”h"]”Œ%2) rompiendo lĂ­neas y strings largos”ah$]”h&]”uh1jqhjshžhhŸhŰh Kjubjr)”}”(hhh]”(jw)”}”(hŒ#3) ColocaciĂłn de llaves y espacios”h]”hŒ#3) ColocaciĂłn de llaves y espacios”…””}”(hj‡hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhj„hžhhŸhŰh Kubhš)”}”(hXqEl otro problema que siempre surge en el estilo C es la colocaciĂłn de llaves. A diferencia del tamaño de la sangrĂ­a, existen pocas razones tĂ©cnicas para elegir una estrategia de ubicaciĂłn sobre la otra, pero la forma preferida, como mostraron los profetas Kernighan y Ritchie, es poner la llave de apertura en la lĂ­nea, y colocar la llave de cierre primero, asĂ­:”h]”hXqEl otro problema que siempre surge en el estilo C es la colocaciĂłn de llaves. A diferencia del tamaño de la sangrĂ­a, existen pocas razones tĂ©cnicas para elegir una estrategia de ubicaciĂłn sobre la otra, pero la forma preferida, como mostraron los profetas Kernighan y Ritchie, es poner la llave de apertura en la lĂ­nea, y colocar la llave de cierre primero, asĂ­:”…””}”(hj•hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Kƒhj„hžhubjx)”}”(hŒ&if (x es verdad) { hacemos y }”h]”hŒ&if (x es verdad) { hacemos y }”…””}”hjŁsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh KŠhj„hžhubhš)”}”(hŒsEsto se aplica a todos los bloques de declaraciones que no son funciones (if, switch, for, while, do). Por ejemplo:”h]”hŒsEsto se aplica a todos los bloques de declaraciones que no son funciones (if, switch, for, while, do). Por ejemplo:”…””}”(hjČhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Khj„hžhubjx)”}”(hŒŹswitch (action) { case KOBJ_ADD: return "add"; case KOBJ_REMOVE: return "remove"; case KOBJ_CHANGE: return "change"; default: return NULL; }”h]”hŒŹswitch (action) { case KOBJ_ADD: return "add"; case KOBJ_REMOVE: return "remove"; case KOBJ_CHANGE: return "change"; default: return NULL; }”…””}”hjÀsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh K“hj„hžhubhš)”}”(hŒ€Sin embargo, hay un caso especial, a saber, las funciones: tienen la llave de apertura al comienzo de la siguiente lĂ­nea, asĂ­:”h]”hŒ€Sin embargo, hay un caso especial, a saber, las funciones: tienen la llave de apertura al comienzo de la siguiente lĂ­nea, asĂ­:”…””}”(hjÏhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh K hj„hžhubjx)”}”(hŒ4int funcion(int x) { cuerpo de la funciĂłn }”h]”hŒ4int funcion(int x) { cuerpo de la funciĂłn }”…””}”hjĘsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh KŁhj„hžhubhš)”}”(hX Gente hereje de todo el mundo ha afirmado que esta inconsistencia es... bueno... inconsistente, pero todas las personas sensatas saben que (a) K&R tienen **razĂłn** y (b) K&R tienen razĂłn. AdemĂĄs, las funciones son especiales de todos modos (no puede anidarlas en C).”h]”(hŒšGente hereje de todo el mundo ha afirmado que esta inconsistencia es... bueno... inconsistente, pero todas las personas sensatas saben que (a) K&R tienen ”…””}”(hjìhžhhŸNh Nubj)”}”(hŒ **razĂłn**”h]”hŒrazĂłn”…””}”(hjôhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽhjìubhŒi y (b) K&R tienen razĂłn. AdemĂĄs, las funciones son especiales de todos modos (no puede anidarlas en C).”…””}”(hjìhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh KȘhj„hžhubhš)”}”(hŒúTenga en cuenta que la llave de cierre estĂĄ vacĂ­a en su lĂ­nea propia, **excepto** en los casos en que es seguida por una continuaciĂłn de la misma declaraciĂłn, es decir, un ``while`` en una sentencia do o un ``else`` en una sentencia if, como en:”h]”(hŒITenga en cuenta que la llave de cierre estĂĄ vacĂ­a en su lĂ­nea propia, ”…””}”(hj hžhhŸNh Nubj)”}”(hŒ **excepto**”h]”hŒexcepto”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽhj ubhŒ] en los casos en que es seguida por una continuaciĂłn de la misma declaraciĂłn, es decir, un ”…””}”(hj hžhhŸNh Nubj)”}”(hŒ ``while``”h]”hŒwhile”…””}”(hj&hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubhŒ en una sentencia do o un ”…””}”(hj hžhhŸNh Nubj)”}”(hŒ``else``”h]”hŒelse”…””}”(hj8hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubhŒ en una sentencia if, como en:”…””}”(hj hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh KŻhj„hžhubjx)”}”(hŒ5do { cuerpo del bucle do } while (condition);”h]”hŒ5do { cuerpo del bucle do } while (condition);”…””}”hjPsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh KŽhj„hžhubhš)”}”(hŒy”h]”hŒy”…””}”(hj_hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Kșhj„hžhubjx)”}”(hŒPif (x == y) { .. } else if (x > y) { ... } else { .... }”h]”hŒPif (x == y) { .. } else if (x > y) { ... } else { .... }”…””}”hjmsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh KŒhj„hžhubhš)”}”(hŒJustificaciĂłn: K&R.”h]”hŒJustificaciĂłn: K&R.”…””}”(hj|hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh KÆhj„hžhubhš)”}”(hXPAdemĂĄs, tenga en cuenta que esta colocaciĂłn de llaves tambiĂ©n minimiza el nĂșmero de lĂ­neas vacĂ­as (o casi vacĂ­as), sin pĂ©rdida de legibilidad. AsĂ­, como el suministro de nuevas lĂ­neas en su pantalla no es un recurso renovable (piense en pantallas de terminal de 25 lĂ­neas), tienes mĂĄs lĂ­neas vacĂ­as para poner comentarios.”h]”hXPAdemĂĄs, tenga en cuenta que esta colocaciĂłn de llaves tambiĂ©n minimiza el nĂșmero de lĂ­neas vacĂ­as (o casi vacĂ­as), sin pĂ©rdida de legibilidad. AsĂ­, como el suministro de nuevas lĂ­neas en su pantalla no es un recurso renovable (piense en pantallas de terminal de 25 lĂ­neas), tienes mĂĄs lĂ­neas vacĂ­as para poner comentarios.”…””}”(hjŠhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh KÈhj„hžhubhš)”}”(hŒJNo use llaves innecesariamente donde una sola declaraciĂłn sea suficiente.”h]”hŒJNo use llaves innecesariamente donde una sola declaraciĂłn sea suficiente.”…””}”(hj˜hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh KÎhj„hžhubjx)”}”(hŒ if (condition) accion();”h]”hŒ if (condition) accion();”…””}”hjŠsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh KĐhj„hžhubhš)”}”(hjah]”hŒy”…””}”(hj”hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh KŐhj„hžhubjx)”}”(hŒ;if (condiciĂłn) haz_esto(); else haz_eso();”h]”hŒ;if (condiciĂłn) haz_esto(); else haz_eso();”…””}”hjÂsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠŒnone”jŒ}”uh1jwhŸhŰh KŚhj„hžhubhš)”}”(hŒEsto no aplica si solo una rama de una declaraciĂłn condicional es una sola declaraciĂłn; en este Ășltimo caso utilice llaves en ambas ramas:”h]”hŒEsto no aplica si solo una rama de una declaraciĂłn condicional es una sola declaraciĂłn; en este Ășltimo caso utilice llaves en ambas ramas:”…””}”(hjÒhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh KȚhj„hžhubjx)”}”(hŒ[if (condiciĂłn) { haz_esto(); haz_eso(); } else { en_otro_caso(); }”h]”hŒ[if (condiciĂłn) { haz_esto(); haz_eso(); } else { en_otro_caso(); }”…””}”hjàsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh Káhj„hžhubhš)”}”(hŒMAdemĂĄs, use llaves cuando un bucle contenga mĂĄs de una declaraciĂłn simple:”h]”hŒMAdemĂĄs, use llaves cuando un bucle contenga mĂĄs de una declaraciĂłn simple:”…””}”(hjïhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Kêhj„hžhubjx)”}”(hŒCwhile (condiciĂłn) { if (test) haz_eso(); }”h]”hŒCwhile (condiciĂłn) { if (test) haz_eso(); }”…””}”hjęsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh Kìhj„hžhubjr)”}”(hhh]”(jw)”}”(hŒ 3.1) Espacios”h]”hŒ 3.1) Espacios”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhj hžhhŸhŰh Kôubhš)”}”(hXÔEl estilo del kernel Linux para el uso de espacios depende (principalmente) del uso de funciĂłn versus uso de palabra clave. Utilice un espacio despuĂ©s de (la mayorĂ­a de) las palabras clave. Las excepciones notables son sizeof, typeof, alignof y __attribute__, que parecen algo asĂ­ como funciones (y generalmente se usan con parĂ©ntesis en Linux, aunque no son requeridos en el idioma, como en: ``sizeof info`` despuĂ©s de que ``struct fileinfo info;`` se declare).”h]”(hXŽEl estilo del kernel Linux para el uso de espacios depende (principalmente) del uso de funciĂłn versus uso de palabra clave. Utilice un espacio despuĂ©s de (la mayorĂ­a de) las palabras clave. Las excepciones notables son sizeof, typeof, alignof y __attribute__, que parecen algo asĂ­ como funciones (y generalmente se usan con parĂ©ntesis en Linux, aunque no son requeridos en el idioma, como en: ”…””}”(hjhžhhŸNh Nubj)”}”(hŒ``sizeof info``”h]”hŒ sizeof info”…””}”(hj%hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ despuĂ©s de que ”…””}”(hjhžhhŸNh Nubj)”}”(hŒ``struct fileinfo info;``”h]”hŒstruct fileinfo info;”…””}”(hj7hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ se declare).”…””}”(hjhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Köhj hžhubhš)”}”(hŒ:AsĂ­ que use un espacio despuĂ©s de estas palabras clave::”h]”hŒ9AsĂ­ que use un espacio despuĂ©s de estas palabras clave:”…””}”(hjOhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Kțhj hžhubjx)”}”(hŒ if, switch, case, for, do, while”h]”hŒ if, switch, case, for, do, while”…””}”hj]sbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆuh1jwhŸhŰh Mhj hžhubhš)”}”(hŒBpero no con sizeof, typeof, alignof, o __attribute__. Por ejemplo,”h]”hŒBpero no con sizeof, typeof, alignof, o __attribute__. Por ejemplo,”…””}”(hjkhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mhj hžhubjx)”}”(hŒs = sizeof(struct file);”h]”hŒs = sizeof(struct file);”…””}”hjysbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh Mhj hžhubhš)”}”(hŒbNo agregue espacios alrededor (dentro) de expresiones entre parĂ©ntesis. Este ejemplo es **malo**:”h]”(hŒYNo agregue espacios alrededor (dentro) de expresiones entre parĂ©ntesis. Este ejemplo es ”…””}”(hjˆhžhhŸNh Nubj)”}”(hŒ**malo**”h]”hŒmalo”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽhjˆubhŒ:”…””}”(hjˆhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M hj hžhubjx)”}”(hŒs = sizeof( struct file );”h]”hŒs = sizeof( struct file );”…””}”hjšsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh M hj hžhubhš)”}”(hŒÇAl declarar datos de puntero o una funciĂłn que devuelve un tipo de puntero, el uso preferido de ``*`` es adyacente al nombre del dato o nombre de la funciĂłn y no junto al nombre del tipo. Ejemplos:”h]”(hŒaAl declarar datos de puntero o una funciĂłn que devuelve un tipo de puntero, el uso preferido de ”…””}”(hj·hžhhŸNh Nubj)”}”(hŒ``*``”h]”hŒ*”…””}”(hjżhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj·ubhŒa es adyacente al nombre del dato o nombre de la funciĂłn y no junto al nombre del tipo. Ejemplos:”…””}”(hj·hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mhj hžhubjx)”}”(hŒnchar *linux_banner; unsigned long long memparse(char *ptr, char **retptr); char *match_strdup(substring_t *s);”h]”hŒnchar *linux_banner; unsigned long long memparse(char *ptr, char **retptr); char *match_strdup(substring_t *s);”…””}”hjŚsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh Mhj hžhubhš)”}”(hŒxUse un espacio alrededor (a cada lado de) la mayorĂ­a de los operadores binarios y ternarios, como cualquiera de estos::”h]”hŒwUse un espacio alrededor (a cada lado de) la mayorĂ­a de los operadores binarios y ternarios, como cualquiera de estos:”…””}”(hjæhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mhj hžhubjx)”}”(hŒ5= + - < > * / % | & ^ <= >= == != ? :”h]”hŒ5= + - < > * / % | & ^ <= >= == != ? :”…””}”hjôsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆuh1jwhŸhŰh Mhj hžhubhš)”}”(hŒ5pero sin espacio despuĂ©s de los operadores unarios::”h]”hŒ4pero sin espacio despuĂ©s de los operadores unarios:”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M!hj hžhubjx)”}”(hŒA& * + - ~ ! sizeof typeof alignof __attribute__ defined”h]”hŒA& * + - ~ ! sizeof typeof alignof __attribute__ defined”…””}”hjsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆuh1jwhŸhŰh M#hj hžhubhš)”}”(hŒSsin espacio antes de los operadores unarios de incremento y decremento del sufijo::”h]”hŒRsin espacio antes de los operadores unarios de incremento y decremento del sufijo:”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M%hj hžhubjx)”}”(hŒ++ --”h]”hŒ++ --”…””}”hj,sbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆuh1jwhŸhŰh M(hj hžhubhš)”}”(hŒSy sin espacio alrededor de los operadores de miembros de estructura ``.`` y ``->``.”h]”(hŒDy sin espacio alrededor de los operadores de miembros de estructura ”…””}”(hj:hžhhŸNh Nubj)”}”(hŒ``.``”h]”hŒ.”…””}”(hjBhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj:ubhŒ y ”…””}”(hj:hžhhŸNh Nubj)”}”(hŒ``->``”h]”hŒ->”…””}”(hjThžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj:ubhŒ.”…””}”(hj:hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M*hj hžhubhš)”}”(hXNo deje espacios en blanco al final de las lĂ­neas. Algunos editores con ``inteligente`` sangrĂ­a insertarĂĄn espacios en blanco al comienzo de las nuevas lĂ­neas como sea apropiado, para que pueda comenzar a escribir la siguiente lĂ­nea de cĂłdigo de inmediato. Sin embargo, algunos de estos editores no eliminan los espacios en blanco si finalmente no termina poniendo una lĂ­nea de cĂłdigo allĂ­, como si dejara una lĂ­nea en blanco. Como resultado, termina con lĂ­neas que contienen espacios en blanco al final.”h]”(hŒINo deje espacios en blanco al final de las lĂ­neas. Algunos editores con ”…””}”(hjlhžhhŸNh Nubj)”}”(hŒ``inteligente``”h]”hŒ inteligente”…””}”(hjthžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjlubhX« sangrĂ­a insertarĂĄn espacios en blanco al comienzo de las nuevas lĂ­neas como sea apropiado, para que pueda comenzar a escribir la siguiente lĂ­nea de cĂłdigo de inmediato. Sin embargo, algunos de estos editores no eliminan los espacios en blanco si finalmente no termina poniendo una lĂ­nea de cĂłdigo allĂ­, como si dejara una lĂ­nea en blanco. Como resultado, termina con lĂ­neas que contienen espacios en blanco al final.”…””}”(hjlhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M-hj hžhubhš)”}”(hX-Git le advertirĂĄ sobre los parches que introducen espacios en blanco al final y puede, opcionalmente, eliminar los espacios en blanco finales por usted; sin embargo, si se aplica una serie de parches, esto puede hacer que los parches posteriores de la serie fallen al cambiar sus lĂ­neas de contexto.”h]”hX-Git le advertirĂĄ sobre los parches que introducen espacios en blanco al final y puede, opcionalmente, eliminar los espacios en blanco finales por usted; sin embargo, si se aplica una serie de parches, esto puede hacer que los parches posteriores de la serie fallen al cambiar sus lĂ­neas de contexto.”…””}”(hjŒhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M5hj hžhubeh}”(h]”Œespacios”ah ]”h"]”Œ 3.1) espacios”ah$]”h&]”uh1jqhj„hžhhŸhŰh Kôubeh}”(h]”Œcolocacion-de-llaves-y-espacios”ah ]”h"]”Œ#3) colocaciĂłn de llaves y espacios”ah$]”h&]”uh1jqhjshžhhŸhŰh Kubjr)”}”(hhh]”(jw)”}”(hŒ4) Nomenclatura”h]”hŒ4) Nomenclatura”…””}”(hj­hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhjȘhžhhŸhŰh M=ubhš)”}”(hXeC es un lenguaje espartano, y sus convenciones de nomenclatura deberĂ­an seguir su ejemplo. A diferencia de los programadores de Modula-2 y Pascal, los programadores de C no usan nombres cuquis como EstaVariableEsUnContadorTemporal. Un programador de C lo llamarĂ­a variable ``tmp``, que es mucho mĂĄs fĂĄcil de escribir, y no es mas difĂ­cil de comprender.”h]”(hXC es un lenguaje espartano, y sus convenciones de nomenclatura deberĂ­an seguir su ejemplo. A diferencia de los programadores de Modula-2 y Pascal, los programadores de C no usan nombres cuquis como EstaVariableEsUnContadorTemporal. Un programador de C lo llamarĂ­a variable ”…””}”(hj»hžhhŸNh Nubj)”}”(hŒ``tmp``”h]”hŒtmp”…””}”(hjĂhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj»ubhŒK, que es mucho mĂĄs fĂĄcil de escribir, y no es mas difĂ­cil de comprender.”…””}”(hj»hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M?hjȘhžhubhš)”}”(hŒÒSIN EMBARGO, mientras que los nombres de mayĂșsculas y minĂșsculas estĂĄn mal vistos, los nombres descriptivos para las variables globales son imprescindibles. Llamar a una funciĂłn global ``foo`` es un delito.”h]”(hŒœSIN EMBARGO, mientras que los nombres de mayĂșsculas y minĂșsculas estĂĄn mal vistos, los nombres descriptivos para las variables globales son imprescindibles. Llamar a una funciĂłn global ”…””}”(hjÛhžhhŸNh Nubj)”}”(hŒ``foo``”h]”hŒfoo”…””}”(hjăhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÛubhŒ es un delito.”…””}”(hjÛhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MFhjȘhžhubhš)”}”(hX-Una variable GLOBAL (para usar solo si **realmente** las necesita) necesita tener un nombre descriptivo, al igual que las funciones globales. Si tiene una funciĂłn que cuenta el nĂșmero de usuarios activos, debe llamar a esta ``contar_usuarios_activos()`` o similar, **no** debe llamarlo ``cntusr()``.”h]”(hŒ'Una variable GLOBAL (para usar solo si ”…””}”(hjûhžhhŸNh Nubj)”}”(hŒ **realmente**”h]”hŒ realmente”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽhjûubhŒź las necesita) necesita tener un nombre descriptivo, al igual que las funciones globales. Si tiene una funciĂłn que cuenta el nĂșmero de usuarios activos, debe llamar a esta ”…””}”(hjûhžhhŸNh Nubj)”}”(hŒ``contar_usuarios_activos()``”h]”hŒcontar_usuarios_activos()”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjûubhŒ o similar, ”…””}”(hjûhžhhŸNh Nubj)”}”(hŒ**no**”h]”hŒno”…””}”(hj'hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽhjûubhŒ debe llamarlo ”…””}”(hjûhžhhŸNh Nubj)”}”(hŒ ``cntusr()``”h]”hŒcntusr()”…””}”(hj9hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjûubhŒ.”…””}”(hjûhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MJhjȘhžhubhš)”}”(hŒĂCodificar el tipo de una funciĂłn en el nombre (lo llamado notaciĂłn hĂșngara) es estĂșpido: el compilador conoce los tipos de todos modos y puede verificar estos, y solo confunde al programador.”h]”hŒĂCodificar el tipo de una funciĂłn en el nombre (lo llamado notaciĂłn hĂșngara) es estĂșpido: el compilador conoce los tipos de todos modos y puede verificar estos, y solo confunde al programador.”…””}”(hjQhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MOhjȘhžhubhš)”}”(hXnLos nombres de las variables LOCALES deben ser breves y directos. Si usted tiene algĂșn contador aleatorio de tipo entero, probablemente deberĂ­a llamarse ``i``. Llamarlo ``loop_counter`` no es productivo, si no hay posibilidad de ser mal entendido. De manera similar, ``tmp`` puede ser casi cualquier tipo de variable que se utiliza para contener un valor temporal.”h]”(hŒ›Los nombres de las variables LOCALES deben ser breves y directos. Si usted tiene algĂșn contador aleatorio de tipo entero, probablemente deberĂ­a llamarse ”…””}”(hj_hžhhŸNh Nubj)”}”(hŒ``i``”h]”hŒi”…””}”(hjghžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj_ubhŒ . Llamarlo ”…””}”(hj_hžhhŸNh Nubj)”}”(hŒ``loop_counter``”h]”hŒ loop_counter”…””}”(hjyhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj_ubhŒR no es productivo, si no hay posibilidad de ser mal entendido. De manera similar, ”…””}”(hj_hžhhŸNh Nubj)”}”(hŒ``tmp``”h]”hŒtmp”…””}”(hj‹hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj_ubhŒZ puede ser casi cualquier tipo de variable que se utiliza para contener un valor temporal.”…””}”(hj_hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MShjȘhžhubhš)”}”(hŒÀSi tiene miedo de mezclar los nombres de las variables locales, tiene otro problema, que se denomina sĂ­ndrome de funciĂłn-crecimiento-desequilibrio-de-hormona. Vea el capĂ­tulo 6 (Funciones).”h]”hŒÀSi tiene miedo de mezclar los nombres de las variables locales, tiene otro problema, que se denomina sĂ­ndrome de funciĂłn-crecimiento-desequilibrio-de-hormona. Vea el capĂ­tulo 6 (Funciones).”…””}”(hjŁhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MYhjȘhžhubhš)”}”(hŒÒPara nombres de sĂ­mbolos y documentaciĂłn, evite introducir nuevos usos de 'master / slave' (maestro / esclavo) (o 'slave' independientemente de 'master') y 'lista negra / lista blanca' (backlist / whitelist).”h]”hŒâPara nombres de sĂ­mbolos y documentaciĂłn, evite introducir nuevos usos de ‘master / slave’ (maestro / esclavo) (o ‘slave’ independientemente de ‘master’) y ‘lista negra / lista blanca’ (backlist / whitelist).”…””}”(hj±hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M]hjȘhžhubhŒdefinition_list”“”)”}”(hhh]”(hŒdefinition_list_item”“”)”}”(hŒńLos reemplazos recomendados para 'maestro / esclavo' son: '{primary,main} / {secondary,replica,subordinate}' '{initiator,requester} / {target,responder}' '{controller,host} / {device,worker,proxy}' 'leader / follower' 'director / performer' ”h]”(hŒterm”“”)”}”(hŒ9Los reemplazos recomendados para 'maestro / esclavo' son:”h]”hŒ=Los reemplazos recomendados para ‘maestro / esclavo’ son:”…””}”(hjÌhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÊhŸhŰh MfhjÆubhŒ definition”“”)”}”(hhh]”hš)”}”(hŒ¶'{primary,main} / {secondary,replica,subordinate}' '{initiator,requester} / {target,responder}' '{controller,host} / {device,worker,proxy}' 'leader / follower' 'director / performer'”h]”hŒÊ‘{primary,main} / {secondary,replica,subordinate}’ ‘{initiator,requester} / {target,responder}’ ‘{controller,host} / {device,worker,proxy}’ ‘leader / follower’ ‘director / performer’”…””}”(hjßhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MbhjÜubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjÆubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÄhŸhŰh MfhjÁubjĆ)”}”(hŒkLos reemplazos recomendados para 'backlist / whitelist' son: 'denylist / allowlist' 'blocklist / passlist' ”h]”(jË)”}”(hŒ`_. Por ejemplo, usando este ejemplo de declaraciĂłn de funciĂłn::”h]”(hŒ1Al escribir prototipos de funciones, mantenga el ”…””}”(hj0 hžhhŸNh Nubj6)”}”(hŒŠ`orden de los elementos regular `_”h]”hŒorden de los elementos regular”…””}”(hj8 hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œorden de los elementos regular”Œrefuri”Œfhttps://lore.kernel.org/mm-commits/CAHk-=wiOCLRny5aifWNhr621kYrJwhfURsa0vFPeUEm8mF0ufg@mail.gmail.com/”uh1j5hj0 ubjd)”}”(hŒi ”h]”h}”(h]”Œorden-de-los-elementos-regular”ah ]”h"]”Œorden de los elementos regular”ah$]”h&]”Œrefuri”jI uh1jcŒ referenced”Khj0 ubhŒ?. Por ejemplo, usando este ejemplo de declaraciĂłn de funciĂłn:”…””}”(hj0 hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mùhjń hžhubjx)”}”(hŒ•__init void * __must_check action(enum magic value, size_t size, u8 count, char *fmt, ...) __printf(4, 5) __malloc;”h]”hŒ•__init void * __must_check action(enum magic value, size_t size, u8 count, char *fmt, ...) __printf(4, 5) __malloc;”…””}”hjb sbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆuh1jwhŸhŰh Męhjń hžhubhš)”}”(hŒAEl orden preferido de elementos para un prototipo de funciĂłn es:”h]”hŒAEl orden preferido de elementos para un prototipo de funciĂłn es:”…””}”(hjp hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mhjń hžhubhŒ bullet_list”“”)”}”(hhh]”(jÿ)”}”(hŒŹclase de almacenamiento (a continuaciĂłn, ``static __always_inline``, teniendo en cuenta que ``__always_inline`` es tĂ©cnicamente un atributo pero se trata como ``inline``)”h]”hš)”}”(hŒŹclase de almacenamiento (a continuaciĂłn, ``static __always_inline``, teniendo en cuenta que ``__always_inline`` es tĂ©cnicamente un atributo pero se trata como ``inline``)”h]”(hŒ*clase de almacenamiento (a continuaciĂłn, ”…””}”(hj‡ hžhhŸNh Nubj)”}”(hŒ``static __always_inline``”h]”hŒstatic __always_inline”…””}”(hj hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj‡ ubhŒ, teniendo en cuenta que ”…””}”(hj‡ hžhhŸNh Nubj)”}”(hŒ``__always_inline``”h]”hŒ__always_inline”…””}”(hjĄ hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj‡ ubhŒ1 es tĂ©cnicamente un atributo pero se trata como ”…””}”(hj‡ hžhhŸNh Nubj)”}”(hŒ ``inline``”h]”hŒinline”…””}”(hjł hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj‡ ubhŒ)”…””}”(hj‡ hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mhjƒ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jțhj€ hžhhŸhŰh Nubjÿ)”}”(hŒ„atributos de clase de almacenamiento (aquĂ­, ``__init`` -- es decir, declaraciones de secciĂłn, pero tambiĂ©n cosas como ``__cold``)”h]”hš)”}”(hŒ„atributos de clase de almacenamiento (aquĂ­, ``__init`` -- es decir, declaraciones de secciĂłn, pero tambiĂ©n cosas como ``__cold``)”h]”(hŒ-atributos de clase de almacenamiento (aquĂ­, ”…””}”(hjŐ hžhhŸNh Nubj)”}”(hŒ ``__init``”h]”hŒ__init”…””}”(hjĘ hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjŐ ubhŒB -- es decir, declaraciones de secciĂłn, pero tambiĂ©n cosas como ”…””}”(hjŐ hžhhŸNh Nubj)”}”(hŒ ``__cold``”h]”hŒ__cold”…””}”(hjï hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j•òhjŐ ubhŒ)”…””}”(hjŐ hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MhjŃ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jțhj€ hžhhŸhŰh Nubjÿ)”}”(hŒ#tipo de retorno (aquĂ­, ``void *``)”h]”hš)”}”(hj h]”(hŒtipo de retorno (aquĂ­, ”…””}”(hj hžhhŸNh Nubj)”}”(hŒ ``void *``”h]”hŒvoid *”…””}”(hj hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubhŒ)”…””}”(hj hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jțhj€ hžhhŸhŰh Nubjÿ)”}”(hŒ6atributos de tipo de retorno (aquĂ­, ``__must_check``)”h]”hš)”}”(hj8 h]”(hŒ%atributos de tipo de retorno (aquĂ­, ”…””}”(hj: hžhhŸNh Nubj)”}”(hŒ``__must_check``”h]”hŒ __must_check”…””}”(hjA hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj: ubhŒ)”…””}”(hj: hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mhj6 ubah}”(h]”h ]”h"]”h$]”h&]”uh1jțhj€ hžhhŸhŰh Nubjÿ)”}”(hŒ)nombre de la funciĂłn (aquĂ­, ``action``)”h]”hš)”}”(hja h]”(hŒnombre de la funciĂłn (aquĂ­, ”…””}”(hjc hžhhŸNh Nubj)”}”(hŒ ``action``”h]”hŒaction”…””}”(hjj hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjc ubhŒ)”…””}”(hjc hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M hj_ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jțhj€ hžhhŸhŰh Nubjÿ)”}”(hŒ°parĂĄmetros de la funciĂłn (aquĂ­, ``(enum magic value, size_t size, u8 count, char *fmt, ...)``, teniendo en cuenta que los nombres de los parĂĄmetros siempre deben incluirse)”h]”hš)”}”(hŒ°parĂĄmetros de la funciĂłn (aquĂ­, ``(enum magic value, size_t size, u8 count, char *fmt, ...)``, teniendo en cuenta que los nombres de los parĂĄmetros siempre deben incluirse)”h]”(hŒ#parĂĄmetros de la funciĂłn (aquĂ­, ”…””}”(hjŒ hžhhŸNh Nubj)”}”(hŒ=``(enum magic value, size_t size, u8 count, char *fmt, ...)``”h]”hŒ9(enum magic value, size_t size, u8 count, char *fmt, ...)”…””}”(hj” hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjŒ ubhŒP, teniendo en cuenta que los nombres de los parĂĄmetros siempre deben incluirse)”…””}”(hjŒ hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M hjˆ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jțhj€ hžhhŸhŰh Nubjÿ)”}”(hŒ@atributos de parĂĄmetros de funciĂłn (aquĂ­, ``__printf(4, 5)``)”h]”hš)”}”(hjŽ h]”(hŒ-atributos de parĂĄmetros de funciĂłn (aquĂ­, ”…””}”(hj¶ hžhhŸNh Nubj)”}”(hŒ``__printf(4, 5)``”h]”hŒ__printf(4, 5)”…””}”(hjœ hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¶ ubhŒ)”…””}”(hj¶ hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M hjČ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jțhj€ hžhhŸhŰh Nubjÿ)”}”(hŒAatributos de comportamiento de la funciĂłn (aquĂ­, ``__malloc``) ”h]”hš)”}”(hŒ@atributos de comportamiento de la funciĂłn (aquĂ­, ``__malloc``)”h]”(hŒ3atributos de comportamiento de la funciĂłn (aquĂ­, ”…””}”(hjß hžhhŸNh Nubj)”}”(hŒ ``__malloc``”h]”hŒ__malloc”…””}”(hjç hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjß ubhŒ)”…””}”(hjß hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MhjÛ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jțhj€ hžhhŸhŰh Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1j~ hŸhŰh Mhjń hžhubhš)”}”(hXœTenga en cuenta que para una **definiciĂłn** de funciĂłn (es decir, el cuerpo real de la funciĂłn), el compilador no permite atributos de parĂĄmetros de funciĂłn despuĂ©s de parĂĄmetros de la funciĂłn. En estos casos, deberĂĄn ir tras los atributos de clase (por ejemplo, tenga en cuenta el cambio de posiciĂłn de ``__printf(4, 5)`` a continuaciĂłn, en comparaciĂłn con el ejemplo de **declaraciĂłn** anterior)::”h]”(hŒTenga en cuenta que para una ”…””}”(hj hžhhŸNh Nubj)”}”(hŒ**definiciĂłn**”h]”hŒ definiciĂłn”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽhj ubhX de funciĂłn (es decir, el cuerpo real de la funciĂłn), el compilador no permite atributos de parĂĄmetros de funciĂłn despuĂ©s de parĂĄmetros de la funciĂłn. En estos casos, deberĂĄn ir tras los atributos de clase (por ejemplo, tenga en cuenta el cambio de posiciĂłn de ”…””}”(hj hžhhŸNh Nubj)”}”(hŒ``__printf(4, 5)``”h]”hŒ__printf(4, 5)”…””}”(hj'hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubhŒ4 a continuaciĂłn, en comparaciĂłn con el ejemplo de ”…””}”(hj hžhhŸNh Nubj)”}”(hŒ**declaraciĂłn**”h]”hŒ declaraciĂłn”…””}”(hj9hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽhj ubhŒ anterior):”…””}”(hj hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mhjń hžhubjx)”}”(hŒ§static __always_inline __init __printf(4, 5) void * __must_check action(enum magic value, size_t size, u8 count, char *fmt, ...) __malloc { ... }”h]”hŒ§static __always_inline __init __printf(4, 5) void * __must_check action(enum magic value, size_t size, u8 count, char *fmt, ...) __malloc { ... }”…””}”hjQsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆuh1jwhŸhŰh Mhjń hžhubeh}”(h]”Œprototipos-de-funciones”ah ]”h"]”Œ6.1) prototipos de funciones”ah$]”h&]”uh1jqhjy hžhhŸhŰh Mïubeh}”(h]”Œ funciones”ah ]”h"]”Œ 6) funciones”ah$]”h&]”uh1jqhjshžhhŸhŰh MÈubjr)”}”(hhh]”(jw)”}”(hŒ#7) Salida centralizada de funciones”h]”hŒ#7) Salida centralizada de funciones”…””}”(hjrhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhjohžhhŸhŰh Mubhš)”}”(hŒČAunque desaprobado por algunas personas, el equivalente de la instrucciĂłn goto es utilizado con frecuencia por los compiladores, en forma de instrucciĂłn de salto incondicional.”h]”hŒČAunque desaprobado por algunas personas, el equivalente de la instrucciĂłn goto es utilizado con frecuencia por los compiladores, en forma de instrucciĂłn de salto incondicional.”…””}”(hj€hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M hjohžhubhš)”}”(hŒȚLa declaraciĂłn goto es Ăștil cuando una funciĂłn sale desde mĂșltiples ubicaciones y se deben realizar algunos trabajos comunes, como la limpieza. Si no se necesita limpieza, entonces simplemente haga return directamente.”h]”hŒȚLa declaraciĂłn goto es Ăștil cuando una funciĂłn sale desde mĂșltiples ubicaciones y se deben realizar algunos trabajos comunes, como la limpieza. Si no se necesita limpieza, entonces simplemente haga return directamente.”…””}”(hjŽhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M$hjohžhubhš)”}”(hXŁElija nombres de etiquetas que digan quĂ© hace el goto o por quĂ© existe el goto. Un ejemplo de un buen nombre podrĂ­a ser ``out_free_buffer:`` (``salida_liberar_buffer``) si al irse libera ``buffer``. Evite usar nombres GW-BASIC como ``err1:`` y ``err2:``, ya que tendrĂ­a que volver a numerarlos si alguna vez agrega o elimina rutas de salida, y hacen que sea difĂ­cil de verificar que sean correctos, de todos modos.”h]”(hŒ{Elija nombres de etiquetas que digan quĂ© hace el goto o por quĂ© existe el goto. Un ejemplo de un buen nombre podrĂ­a ser ”…””}”(hjœhžhhŸNh Nubj)”}”(hŒ``out_free_buffer:``”h]”hŒout_free_buffer:”…””}”(hj€hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjœubhŒ (”…””}”(hjœhžhhŸNh Nubj)”}”(hŒ``salida_liberar_buffer``”h]”hŒsalida_liberar_buffer”…””}”(hj¶hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjœubhŒ) si al irse libera ”…””}”(hjœhžhhŸNh Nubj)”}”(hŒ ``buffer``”h]”hŒbuffer”…””}”(hjÈhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjœubhŒ#. Evite usar nombres GW-BASIC como ”…””}”(hjœhžhhŸNh Nubj)”}”(hŒ ``err1:``”h]”hŒerr1:”…””}”(hjÚhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjœubhŒ y ”…””}”(hjœhžhhŸNh Nubj)”}”(hŒ ``err2:``”h]”hŒerr2:”…””}”(hjìhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjœubhŒŁ, ya que tendrĂ­a que volver a numerarlos si alguna vez agrega o elimina rutas de salida, y hacen que sea difĂ­cil de verificar que sean correctos, de todos modos.”…””}”(hjœhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M(hjohžhubhš)”}”(hŒLa razĂłn para usar gotos es:”h]”hŒLa razĂłn para usar gotos es:”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M/hjohžhubj )”}”(hhh]”(jÿ)”}”(hŒILas declaraciones incondicionales son mĂĄs fĂĄciles de entender y seguir.”h]”hš)”}”(hjh]”hŒILas declaraciones incondicionales son mĂĄs fĂĄciles de entender y seguir.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M1hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jțhjhžhhŸhŰh Nubjÿ)”}”(hŒse reduce el anidamiento”h]”hš)”}”(hj.h]”hŒse reduce el anidamiento”…””}”(hj0hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M2hj,ubah}”(h]”h ]”h"]”h$]”h&]”uh1jțhjhžhhŸhŰh Nubjÿ)”}”(hŒ_errores al no actualizar los puntos de salida individuales al hacer modificaciones son evitados”h]”hš)”}”(hŒ_errores al no actualizar los puntos de salida individuales al hacer modificaciones son evitados”h]”hŒ_errores al no actualizar los puntos de salida individuales al hacer modificaciones son evitados”…””}”(hjGhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M3hjCubah}”(h]”h ]”h"]”h$]”h&]”uh1jțhjhžhhŸhŰh Nubjÿ)”}”(hŒDahorra el trabajo del compilador de optimizar cĂłdigo redundante ;) ”h]”hš)”}”(hŒCahorra el trabajo del compilador de optimizar cĂłdigo redundante ;)”h]”hŒCahorra el trabajo del compilador de optimizar cĂłdigo redundante ;)”…””}”(hj_hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M5hj[ubah}”(h]”h ]”h"]”h$]”h&]”uh1jțhjhžhhŸhŰh Nubeh}”(h]”h ]”h"]”h$]”h&]”j j uh1j~ hŸhŰh M1hjohžhubjx)”}”(hXąint fun(int a) { int result = 0; char *buffer; buffer = kmalloc(SIZE, GFP_KERNEL); if (!buffer) return -ENOMEM; if (condition1) { while (loop1) { ... } result = 1; goto out_free_buffer; } ... out_free_buffer: kfree(buffer); return result; }”h]”hXąint fun(int a) { int result = 0; char *buffer; buffer = kmalloc(SIZE, GFP_KERNEL); if (!buffer) return -ENOMEM; if (condition1) { while (loop1) { ... } result = 1; goto out_free_buffer; } ... out_free_buffer: kfree(buffer); return result; }”…””}”hjysbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh M7hjohžhubhš)”}”(hŒRUn tipo comĂșn de error a tener en cuenta es "un error de error" que es algo asĂ­:”h]”hŒVUn tipo comĂșn de error a tener en cuenta es “un error de error” que es algo asĂ­:”…””}”(hjˆhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MOhjohžhubjx)”}”(hŒEerr: kfree(foo->bar); kfree(foo); return ret;”h]”hŒEerr: kfree(foo->bar); kfree(foo); return ret;”…””}”hj–sbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh MRhjohžhubhš)”}”(hŒœEl error en este cĂłdigo es que en algunas rutas de salida, ``foo`` es NULL. Normalmente la soluciĂłn para esto es dividirlo en dos etiquetas de error ``err_free_bar:`` y ``err_free_foo:``:”h]”(hŒbar); err_free_foo: kfree(foo); return ret;”h]”hŒ\err_free_bar: kfree(foo->bar); err_free_foo: kfree(foo); return ret;”…””}”hjésbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh M]hjohžhubhš)”}”(hŒKIdealmente, deberĂ­a simular errores para probar todas las rutas de salida.”h]”hŒKIdealmente, deberĂ­a simular errores para probar todas las rutas de salida.”…””}”(hjűhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mehjohžhubeh}”(h]”Œ salida-centralizada-de-funciones”ah ]”h"]”Œ#7) salida centralizada de funciones”ah$]”h&]”uh1jqhjshžhhŸhŰh Mubjr)”}”(hhh]”(jw)”}”(hŒ8) Comentarios”h]”hŒ8) Comentarios”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhjhžhhŸhŰh Miubhš)”}”(hXLos comentarios son buenos, pero tambiĂ©n existe el peligro de comentar demasiado. NUNCA trate de explicar CÓMO funciona su cĂłdigo en un comentario: es mucho mejor escribir el cĂłdigo para que el **funcionamiento** sea obvio y es una pĂ©rdida de tiempo explicar cĂłdigo mal escrito.”h]”(hŒÆLos comentarios son buenos, pero tambiĂ©n existe el peligro de comentar demasiado. NUNCA trate de explicar CÓMO funciona su cĂłdigo en un comentario: es mucho mejor escribir el cĂłdigo para que el ”…””}”(hjhžhhŸNh Nubj)”}”(hŒ**funcionamiento**”h]”hŒfuncionamiento”…””}”(hj'hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽhjubhŒD sea obvio y es una pĂ©rdida de tiempo explicar cĂłdigo mal escrito.”…””}”(hjhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mkhjhžhubhš)”}”(hX0Generalmente, desea que sus comentarios digan QUÉ hace su cĂłdigo, no CÓMO. AdemĂĄs, trate de evitar poner comentarios dentro del cuerpo de una funciĂłn: si la funciĂłn es tan compleja que necesita comentar por separado partes de esta, probablemente deberĂ­a volver al capĂ­tulo 6 una temporada. Puede hacer pequeños comentarios para notar o advertir sobre algo particularmente inteligente (o feo), pero trate de evitar el exceso. En su lugar, ponga los comentarios al principio de la funciĂłn, diga a la gente lo que hace y posiblemente POR QUÉ hace esto.”h]”hX0Generalmente, desea que sus comentarios digan QUÉ hace su cĂłdigo, no CÓMO. AdemĂĄs, trate de evitar poner comentarios dentro del cuerpo de una funciĂłn: si la funciĂłn es tan compleja que necesita comentar por separado partes de esta, probablemente deberĂ­a volver al capĂ­tulo 6 una temporada. Puede hacer pequeños comentarios para notar o advertir sobre algo particularmente inteligente (o feo), pero trate de evitar el exceso. En su lugar, ponga los comentarios al principio de la funciĂłn, diga a la gente lo que hace y posiblemente POR QUÉ hace esto.”…””}”(hj?hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mqhjhžhubhš)”}”(hŒÀAl comentar las funciones de la API del kernel, utilice el formato kernel-doc. Consulte los archivos en :ref:`Documentation/doc-guide/ ` y ``scripts/kernel-doc`` para mĂĄs detalles.”h]”(hŒhAl comentar las funciones de la API del kernel, utilice el formato kernel-doc. Consulte los archivos en ”…””}”(hjMhžhhŸNh Nubh)”}”(hŒ+:ref:`Documentation/doc-guide/ `”h]”hæ)”}”(hjWh]”hŒDocumentation/doc-guide/”…””}”(hjYhžhhŸNh Nubah}”(h]”h ]”(hńŒstd”Œstd-ref”eh"]”h$]”h&]”uh1hćhjUubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hțŒ refdomain”jcŒreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆjŒ doc_guide”uh1hhŸhŰh MzhjMubhŒ y ”…””}”(hjMhžhhŸNh Nubj)”}”(hŒ``scripts/kernel-doc``”h]”hŒscripts/kernel-doc”…””}”(hjyhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjMubhŒ para mĂĄs detalles.”…””}”(hjMhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mzhjhžhubhš)”}”(hŒCEl estilo preferido para comentarios largos (de varias lĂ­neas) es:”h]”hŒCEl estilo preferido para comentarios largos (de varias lĂ­neas) es:”…””}”(hj‘hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M~hjhžhubjx)”}”(hX/* * Este es el estilo preferido para comentarios * multilĂ­nea en el cĂłdigo fuente del kernel Linux. * Por favor, utilĂ­celo constantemente. * * DescripciĂłn: Una columna de asteriscos en el lado izquierdo, * con lĂ­neas iniciales y finales casi en blanco. */”h]”hX/* * Este es el estilo preferido para comentarios * multilĂ­nea en el cĂłdigo fuente del kernel Linux. * Por favor, utilĂ­celo constantemente. * * DescripciĂłn: Una columna de asteriscos en el lado izquierdo, * con lĂ­neas iniciales y finales casi en blanco. */”…””}”hjŸsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh M€hjhžhubhš)”}”(hŒuPara archivos en net/ y drivers/net/, el estilo preferido para comentarios largos (multi-linea) es un poco diferente.”h]”hŒuPara archivos en net/ y drivers/net/, el estilo preferido para comentarios largos (multi-linea) es un poco diferente.”…””}”(hjźhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M‹hjhžhubjx)”}”(hŒÚ/* El estilo de comentario preferido para archivos en net/ y drivers/net * se asemeja a esto. * * Es casi lo mismo que el estilo de comentario generalmente preferido, * pero no hay una lĂ­nea inicial casi en blanco. */”h]”hŒÚ/* El estilo de comentario preferido para archivos en net/ y drivers/net * se asemeja a esto. * * Es casi lo mismo que el estilo de comentario generalmente preferido, * pero no hay una lĂ­nea inicial casi en blanco. */”…””}”hjŒsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh MŽhjhžhubhš)”}”(hXTambiĂ©n es importante comentar los datos, ya sean tipos bĂĄsicos o derivados. Para este fin, use solo una declaraciĂłn de datos por lĂ­nea (sin comas para mĂșltiples declaraciones de datos). Esto le deja espacio para un pequeño comentario sobre cada elemento, explicando su uso.”h]”hXTambiĂ©n es importante comentar los datos, ya sean tipos bĂĄsicos o derivados. Para este fin, use solo una declaraciĂłn de datos por lĂ­nea (sin comas para mĂșltiples declaraciones de datos). Esto le deja espacio para un pequeño comentario sobre cada elemento, explicando su uso.”…””}”(hjËhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M—hjhžhubeh}”(h]”Œ comentarios”ah ]”h"]”Œ8) comentarios”ah$]”h&]”uh1jqhjshžhhŸhŰh Miubjr)”}”(hhh]”(jw)”}”(hŒ9) Has hecho un desastre”h]”hŒ9) Has hecho un desastre”…””}”(hjähžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhjáhžhhŸhŰh Mubhš)”}”(hX|EstĂĄ bien, todos lo hacemos. Probablemente un antiguo usuario de Unix le haya dicho que ``GNU emacs`` formatea automĂĄticamente las fuentes C por usted, y ha notado que sĂ­, lo hace, pero los por defecto que tiene son menos que deseables (de hecho, son peores que los aleatorios) escribiendo - un nĂșmero infinito de monos escribiendo en GNU emacs nunca harĂĄn un buen programa).”h]”(hŒYEstĂĄ bien, todos lo hacemos. Probablemente un antiguo usuario de Unix le haya dicho que ”…””}”(hjòhžhhŸNh Nubj)”}”(hŒ ``GNU emacs``”h]”hŒ GNU emacs”…””}”(hjúhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjòubhX formatea automĂĄticamente las fuentes C por usted, y ha notado que sĂ­, lo hace, pero los por defecto que tiene son menos que deseables (de hecho, son peores que los aleatorios) escribiendo - un nĂșmero infinito de monos escribiendo en GNU emacs nunca harĂĄn un buen programa).”…””}”(hjòhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MŸhjáhžhubhš)”}”(hŒšPor lo tanto, puede deshacerse de GNU emacs o cambiarlo y usar valores mĂĄs sanos. Para hacer esto Ășltimo, puede pegar lo siguiente en su archivo .emacs:”h]”hŒšPor lo tanto, puede deshacerse de GNU emacs o cambiarlo y usar valores mĂĄs sanos. Para hacer esto Ășltimo, puede pegar lo siguiente en su archivo .emacs:”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MŠhjáhžhubjx)”}”(hX(defun c-lineup-arglist-tabs-only (ignored) "Line up argument lists by tabs, not spaces" (let* ((anchor (c-langelem-pos c-syntactic-element)) (column (c-langelem-2nd-pos c-syntactic-element)) (offset (- (1+ column) anchor)) (steps (floor offset c-basic-offset))) (* (max steps 1) c-basic-offset))) (dir-locals-set-class-variables 'linux-kernel '((c-mode . ( (c-basic-offset . 8) (c-label-minimum-indentation . 0) (c-offsets-alist . ( (arglist-close . c-lineup-arglist-tabs-only) (arglist-cont-nonempty . (c-lineup-gcc-asm-reg c-lineup-arglist-tabs-only)) (arglist-intro . +) (brace-list-intro . +) (c . c-lineup-C-comments) (case-label . 0) (comment-intro . c-lineup-comment) (cpp-define-intro . +) (cpp-macro . -1000) (cpp-macro-cont . +) (defun-block-intro . +) (else-clause . 0) (func-decl-cont . +) (inclass . +) (inher-cont . c-lineup-multi-inher) (knr-argdecl-intro . 0) (label . -1000) (statement . 0) (statement-block-intro . +) (statement-case-intro . +) (statement-cont . +) (substatement . +) )) (indent-tabs-mode . t) (show-trailing-whitespace . t) )))) (dir-locals-set-directory-class (expand-file-name "~/src/linux-trees") 'linux-kernel)”h]”hX(defun c-lineup-arglist-tabs-only (ignored) "Line up argument lists by tabs, not spaces" (let* ((anchor (c-langelem-pos c-syntactic-element)) (column (c-langelem-2nd-pos c-syntactic-element)) (offset (- (1+ column) anchor)) (steps (floor offset c-basic-offset))) (* (max steps 1) c-basic-offset))) (dir-locals-set-class-variables 'linux-kernel '((c-mode . ( (c-basic-offset . 8) (c-label-minimum-indentation . 0) (c-offsets-alist . ( (arglist-close . c-lineup-arglist-tabs-only) (arglist-cont-nonempty . (c-lineup-gcc-asm-reg c-lineup-arglist-tabs-only)) (arglist-intro . +) (brace-list-intro . +) (c . c-lineup-C-comments) (case-label . 0) (comment-intro . c-lineup-comment) (cpp-define-intro . +) (cpp-macro . -1000) (cpp-macro-cont . +) (defun-block-intro . +) (else-clause . 0) (func-decl-cont . +) (inclass . +) (inher-cont . c-lineup-multi-inher) (knr-argdecl-intro . 0) (label . -1000) (statement . 0) (statement-block-intro . +) (statement-case-intro . +) (statement-cont . +) (substatement . +) )) (indent-tabs-mode . t) (show-trailing-whitespace . t) )))) (dir-locals-set-directory-class (expand-file-name "~/src/linux-trees") 'linux-kernel)”…””}”hj sbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠŒnone”jŒ}”uh1jwhŸhŰh MȘhjáhžhubhš)”}”(hŒvEsto harĂĄ que emacs funcione mejor con el estilo de cĂłdigo del kernel para C en archivos bajo ``~/src/linux-trees``.”h]”(hŒ`Esto harĂĄ que emacs funcione mejor con el estilo de cĂłdigo del kernel para C en archivos bajo ”…””}”(hj0hžhhŸNh Nubj)”}”(hŒ``~/src/linux-trees``”h]”hŒ~/src/linux-trees”…””}”(hj8hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj0ubhŒ.”…””}”(hj0hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MÛhjáhžhubhš)”}”(hŒgPero incluso si no logra que emacs realice un formateo correcto, no todo estĂĄ perdido: use ``indent``.”h]”(hŒ\Pero incluso si no logra que emacs realice un formateo correcto, no todo estĂĄ perdido: use ”…””}”(hjPhžhhŸNh Nubj)”}”(hŒ ``indent``”h]”hŒindent”…””}”(hjXhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjPubhŒ.”…””}”(hjPhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MȚhjáhžhubhš)”}”(hXAhora bien, de nuevo, la sangrĂ­a de GNU tiene la misma configuraciĂłn de muerte cerebral que GNU emacs tiene, por lo que necesita darle algunas opciones de lĂ­nea de comando. Sin embargo, eso no es tan malo, porque incluso los creadores de GNU indent reconocen la autoridad de K&R (la gente de GNU no es mala, solo estĂĄn gravemente equivocados en este asunto), por lo que simplemente de a la sangrĂ­a las opciones ``-kr -i8`` (significa ``K&R, guiones de 8 caracteres``), o use ``scripts/Lindent``, que indenta con ese estilo.”h]”(hX Ahora bien, de nuevo, la sangrĂ­a de GNU tiene la misma configuraciĂłn de muerte cerebral que GNU emacs tiene, por lo que necesita darle algunas opciones de lĂ­nea de comando. Sin embargo, eso no es tan malo, porque incluso los creadores de GNU indent reconocen la autoridad de K&R (la gente de GNU no es mala, solo estĂĄn gravemente equivocados en este asunto), por lo que simplemente de a la sangrĂ­a las opciones ”…””}”(hjphžhhŸNh Nubj)”}”(hŒ ``-kr -i8``”h]”hŒ-kr -i8”…””}”(hjxhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjpubhŒ (significa ”…””}”(hjphžhhŸNh Nubj)”}”(hŒ ``K&R, guiones de 8 caracteres``”h]”hŒK&R, guiones de 8 caracteres”…””}”(hjŠhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjpubhŒ ), o use ”…””}”(hjphžhhŸNh Nubj)”}”(hŒ``scripts/Lindent``”h]”hŒscripts/Lindent”…””}”(hjœhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjpubhŒ, que indenta con ese estilo.”…””}”(hjphžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Máhjáhžhubhš)”}”(hŒă``indent`` tiene muchas opciones, y especialmente cuando se trata de comentar reformateos, es posible que desee echar un vistazo a la pĂĄgina del manual. Pero recuerde: ``indent`` no es la soluciĂłn para una mala programaciĂłn.”h]”(j)”}”(hŒ ``indent``”h]”hŒindent”…””}”(hjžhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjŽubhŒŸ tiene muchas opciones, y especialmente cuando se trata de comentar reformateos, es posible que desee echar un vistazo a la pĂĄgina del manual. Pero recuerde: ”…””}”(hjŽhžhhŸNh Nubj)”}”(hŒ ``indent``”h]”hŒindent”…””}”(hjÊhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjŽubhŒ0 no es la soluciĂłn para una mala programaciĂłn.”…””}”(hjŽhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mêhjáhžhubhš)”}”(hXTenga en cuenta que tambiĂ©n puede usar la herramienta ``clang-format`` para ayudarlo con estas reglas, para volver a formatear rĂĄpidamente partes de su cĂłdigo automĂĄticamente, y revisar archivos completos para detectar errores de estilo del cĂłdigo, errores tipogrĂĄficos y posibles mejoras. TambiĂ©n es Ăștil para ordenar ``#includes``, para alinear variables/macros, para redistribuir texto y otras tareas similares. Vea el archivo :ref:`Documentation/dev-tools/clang-format.rst ` para mĂĄs detalles.”h]”(hŒ7Tenga en cuenta que tambiĂ©n puede usar la herramienta ”…””}”(hjâhžhhŸNh Nubj)”}”(hŒ``clang-format``”h]”hŒ clang-format”…””}”(hjêhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjâubhX para ayudarlo con estas reglas, para volver a formatear rĂĄpidamente partes de su cĂłdigo automĂĄticamente, y revisar archivos completos para detectar errores de estilo del cĂłdigo, errores tipogrĂĄficos y posibles mejoras. TambiĂ©n es Ăștil para ordenar ”…””}”(hjâhžhhŸNh Nubj)”}”(hŒ ``#includes``”h]”hŒ #includes”…””}”(hjühžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjâubhŒb, para alinear variables/macros, para redistribuir texto y otras tareas similares. Vea el archivo ”…””}”(hjâhžhhŸNh Nubh)”}”(hŒ=:ref:`Documentation/dev-tools/clang-format.rst `”h]”hæ)”}”(hjh]”hŒ(Documentation/dev-tools/clang-format.rst”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”(hńŒstd”Œstd-ref”eh"]”h$]”h&]”uh1hćhjubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hțŒ refdomain”jŒreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆjŒ clangformat”uh1hhŸhŰh MïhjâubhŒ para mĂĄs detalles.”…””}”(hjâhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mïhjáhžhubeh}”(h]”Œhas-hecho-un-desastre”ah ]”h"]”Œ9) has hecho un desastre”ah$]”h&]”uh1jqhjshžhhŸhŰh Mubjr)”}”(hhh]”(jw)”}”(hŒ)10) Archivos de configuraciĂłn de Kconfig”h]”hŒ)10) Archivos de configuraciĂłn de Kconfig”…””}”(hjChžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhj@hžhhŸhŰh Mùubhš)”}”(hXPara todos los archivos de configuraciĂłn de Kconfig* en todo el ĂĄrbol fuente, la sangrĂ­a es algo diferente. Las lĂ­neas bajo una definiciĂłn ``config`` estĂĄn indentadas con una tabulaciĂłn, mientras que el texto de ayuda tiene una sangrĂ­a adicional de dos espacios. Ejemplo::”h]”(hŒPara todos los archivos de configuraciĂłn de Kconfig* en todo el ĂĄrbol fuente, la sangrĂ­a es algo diferente. Las lĂ­neas bajo una definiciĂłn ”…””}”(hjQhžhhŸNh Nubj)”}”(hŒ ``config``”h]”hŒconfig”…””}”(hjYhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjQubhŒ} estĂĄn indentadas con una tabulaciĂłn, mientras que el texto de ayuda tiene una sangrĂ­a adicional de dos espacios. Ejemplo:”…””}”(hjQhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mûhj@hžhubjx)”}”(hXMconfig AUDIT bool "Soporte para auditar" depends on NET help Habilita la infraestructura de auditorĂ­a que se puede usar con otro subsistema kernel, como SELinux (que requiere esto para registro de salida de mensajes avc). No hace auditorĂ­a de llamadas al sistema sin CONFIG_AUDITSYSCALL.”h]”hXMconfig AUDIT bool "Soporte para auditar" depends on NET help Habilita la infraestructura de auditorĂ­a que se puede usar con otro subsistema kernel, como SELinux (que requiere esto para registro de salida de mensajes avc). No hace auditorĂ­a de llamadas al sistema sin CONFIG_AUDITSYSCALL.”…””}”hjqsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆuh1jwhŸhŰh Mhj@hžhubhš)”}”(hŒžCaracterĂ­sticas seriamente peligrosas (como soporte de escritura para ciertos filesystems) deben anunciar esto de forma destacada en su cadena de solicitud::”h]”hŒCaracterĂ­sticas seriamente peligrosas (como soporte de escritura para ciertos filesystems) deben anunciar esto de forma destacada en su cadena de solicitud:”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M hj@hžhubjx)”}”(hŒ`config ADFS_FS_RW bool "ADFS write support (DANGEROUS)" depends on ADFS_FS ...”h]”hŒ`config ADFS_FS_RW bool "ADFS write support (DANGEROUS)" depends on ADFS_FS ...”…””}”hjsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆuh1jwhŸhŰh M hj@hžhubhš)”}”(hŒŒPara obtener la documentaciĂłn completa sobre los archivos de configuraciĂłn, consulte el archivo Documentation/kbuild/kconfig-language.rst.”h]”hŒŒPara obtener la documentaciĂłn completa sobre los archivos de configuraciĂłn, consulte el archivo Documentation/kbuild/kconfig-language.rst.”…””}”(hj›hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mhj@hžhubeh}”(h]”Œ$archivos-de-configuracion-de-kconfig”ah ]”h"]”Œ)10) archivos de configuraciĂłn de kconfig”ah$]”h&]”uh1jqhjshžhhŸhŰh Mùubjr)”}”(hhh]”(jw)”}”(hŒ11) Estructuras de datos”h]”hŒ11) Estructuras de datos”…””}”(hjŽhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhj±hžhhŸhŰh Mubhš)”}”(hXLas estructuras de datos que tienen visibilidad fuera del contexto de un solo subproceso en el que son creadas y destruidas, siempre debe tener contadores de referencia. En el kernel, la recolecciĂłn de basura no existe (y fuera, la recolecciĂłn de basura del kernel es lenta e ineficiente), lo que significa que absolutamente **tiene** para hacer referencia y contar todos sus usos.”h]”(hXGLas estructuras de datos que tienen visibilidad fuera del contexto de un solo subproceso en el que son creadas y destruidas, siempre debe tener contadores de referencia. En el kernel, la recolecciĂłn de basura no existe (y fuera, la recolecciĂłn de basura del kernel es lenta e ineficiente), lo que significa que absolutamente ”…””}”(hjÂhžhhŸNh Nubj)”}”(hŒ **tiene**”h]”hŒtiene”…””}”(hjÊhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽhjÂubhŒ/ para hacer referencia y contar todos sus usos.”…””}”(hjÂhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mhj±hžhubhš)”}”(hX/El conteo de referencias significa que puede evitar el bloqueo y permite que mĂșltiples usuarios tengan acceso a la estructura de datos en paralelo - y no tengan que preocuparse de que la estructura, de repente, desaparezca debajo de su control, solo porque durmieron o hicieron otra cosa por un tiempo.”h]”hX/El conteo de referencias significa que puede evitar el bloqueo y permite que mĂșltiples usuarios tengan acceso a la estructura de datos en paralelo - y no tengan que preocuparse de que la estructura, de repente, desaparezca debajo de su control, solo porque durmieron o hicieron otra cosa por un tiempo.”…””}”(hjâhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M hj±hžhubhš)”}”(hX-Tenga en cuenta que el bloqueo **no** reemplaza el recuento de referencia. El bloqueo se utiliza para mantener la coherencia de las estructuras de datos, mientras que la referencia y contar es una tĂ©cnica de gestiĂłn de memoria. Por lo general, ambos son necesarios, y no deben confundirse entre sĂ­.”h]”(hŒTenga en cuenta que el bloqueo ”…””}”(hjđhžhhŸNh Nubj)”}”(hŒ**no**”h]”hŒno”…””}”(hjűhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽhjđubhX reemplaza el recuento de referencia. El bloqueo se utiliza para mantener la coherencia de las estructuras de datos, mientras que la referencia y contar es una tĂ©cnica de gestiĂłn de memoria. Por lo general, ambos son necesarios, y no deben confundirse entre sĂ­.”…””}”(hjđhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M&hj±hžhubhš)”}”(hX#De hecho, muchas estructuras de datos pueden tener dos niveles de conteo de referencias, cuando hay usuarios de diferentes ``clases``. El conteo de subclases cuenta el nĂșmero de usuarios de la subclase y disminuye el conteo global solo una vez, cuando el recuento de subclases llega a cero.”h]”(hŒ{De hecho, muchas estructuras de datos pueden tener dos niveles de conteo de referencias, cuando hay usuarios de diferentes ”…””}”(hjhžhhŸNh Nubj)”}”(hŒ ``clases``”h]”hŒclases”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒž. El conteo de subclases cuenta el nĂșmero de usuarios de la subclase y disminuye el conteo global solo una vez, cuando el recuento de subclases llega a cero.”…””}”(hjhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M,hj±hžhubhš)”}”(hŒűSe pueden encontrar ejemplos de este tipo de ``recuento de referencias de niveles mĂșltiples`` en la gestiĂłn de memoria (``struct mm_struct``: mm_users y mm_count), y en cĂłdigo del sistema de archivos (``struct super_block``: s_count y s_active).”h]”(hŒ-Se pueden encontrar ejemplos de este tipo de ”…””}”(hj0hžhhŸNh Nubj)”}”(hŒ1``recuento de referencias de niveles mĂșltiples``”h]”hŒ-recuento de referencias de niveles mĂșltiples”…””}”(hj8hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj0ubhŒ en la gestiĂłn de memoria (”…””}”(hj0hžhhŸNh Nubj)”}”(hŒ``struct mm_struct``”h]”hŒstruct mm_struct”…””}”(hjJhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj0ubhŒ>: mm_users y mm_count), y en cĂłdigo del sistema de archivos (”…””}”(hj0hžhhŸNh Nubj)”}”(hŒ``struct super_block``”h]”hŒstruct super_block”…””}”(hj\hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj0ubhŒ: s_count y s_active).”…””}”(hj0hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M1hj±hžhubhš)”}”(hŒRecuerde: si otro hilo puede encontrar su estructura de datos y usted no tiene un recuento de referencias, es casi seguro que tiene un error.”h]”hŒRecuerde: si otro hilo puede encontrar su estructura de datos y usted no tiene un recuento de referencias, es casi seguro que tiene un error.”…””}”(hjthžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M6hj±hžhubeh}”(h]”Œestructuras-de-datos”ah ]”h"]”Œ11) estructuras de datos”ah$]”h&]”uh1jqhjshžhhŸhŰh Mubjr)”}”(hhh]”(jw)”}”(hŒ12) Macros, Enums y RTL”h]”hŒ12) Macros, Enums y RTL”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhjŠhžhhŸhŰh M:ubhš)”}”(hŒhLos nombres de macros que definen constantes y etiquetas en enumeraciones (enums) estĂĄn en mayĂșsculas.”h]”hŒhLos nombres de macros que definen constantes y etiquetas en enumeraciones (enums) estĂĄn en mayĂșsculas.”…””}”(hj›hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M<hjŠhžhubjx)”}”(hŒ#define CONSTANTE 0x12345”h]”hŒ#define CONSTANTE 0x12345”…””}”hj©sbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh M?hjŠhžhubhš)”}”(hŒHSe prefieren los enums cuando se definen varias constantes relacionadas.”h]”hŒHSe prefieren los enums cuando se definen varias constantes relacionadas.”…””}”(hjžhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MChjŠhžhubhš)”}”(hŒSe aprecian los nombres de macro en MAYÚSCULAS, pero las macros que se asemejan a funciones puede ser nombradas en minĂșscula.”h]”hŒSe aprecian los nombres de macro en MAYÚSCULAS, pero las macros que se asemejan a funciones puede ser nombradas en minĂșscula.”…””}”(hjÆhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MEhjŠhžhubhš)”}”(hŒ_Generalmente, las funciones en lĂ­nea son preferibles a las macros que se asemejan a funciones.”h]”hŒ_Generalmente, las funciones en lĂ­nea son preferibles a las macros que se asemejan a funciones.”…””}”(hjÔhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MHhjŠhžhubhš)”}”(hŒKLas macros con varias instrucciones deben contenerse en un bloque do-while:”h]”hŒKLas macros con varias instrucciones deben contenerse en un bloque do-while:”…””}”(hjâhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MKhjŠhžhubjx)”}”(hŒÛ#define macrofun(a, b, c) \ do { \ if (a == 5) \ haz_esto(b, c); \ } while (0)”h]”hŒÛ#define macrofun(a, b, c) \ do { \ if (a == 5) \ haz_esto(b, c); \ } while (0)”…””}”hjđsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh MMhjŠhžhubhš)”}”(hŒCosas a evitar al usar macros:”h]”hŒCosas a evitar al usar macros:”…””}”(hjÿhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MUhjŠhžhubjú)”}”(hhh]”jÿ)”}”(hŒ(macros que afectan el flujo de control: ”h]”hš)”}”(hŒ'macros que afectan el flujo de control:”h]”hŒ'macros que afectan el flujo de control:”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MWhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jțhj hžhhŸhŰh Nubah}”(h]”h ]”h"]”h$]”h&]”j7 Œarabic”j9 hj; j< uh1jùhjŠhžhhŸhŰh MWubjx)”}”(hŒÛ#define FOO(x) \ do { \ if (blah(x) < 0) \ return -EBUGGERED; \ } while (0)”h]”hŒÛ#define FOO(x) \ do { \ if (blah(x) < 0) \ return -EBUGGERED; \ } while (0)”…””}”hj/sbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh MYhjŠhžhubhš)”}”(hŒšes una **muy** mala idea. Parece una llamada de funciĂłn pero sale de la funciĂłn de ``llamada``; no rompa los analizadores internos de aquellos que leerĂĄn el cĂłdigo.”h]”(hŒes una ”…””}”(hj>hžhhŸNh Nubj)”}”(hŒ**muy**”h]”hŒmuy”…””}”(hjFhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽhj>ubhŒG mala idea. Parece una llamada de funciĂłn pero sale de la funciĂłn de ”…””}”(hj>hžhhŸNh Nubj)”}”(hŒ ``llamada``”h]”hŒllamada”…””}”(hjXhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj>ubhŒH; no rompa los analizadores internos de aquellos que leerĂĄn el cĂłdigo.”…””}”(hj>hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MahjŠhžhubjú)”}”(hhh]”jÿ)”}”(hŒGmacros que dependen de tener una variable local con un nombre mĂĄgico: ”h]”hš)”}”(hŒFmacros que dependen de tener una variable local con un nombre mĂĄgico:”h]”hŒFmacros que dependen de tener una variable local con un nombre mĂĄgico:”…””}”(hjwhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mehjsubah}”(h]”h ]”h"]”h$]”h&]”uh1jțhjphžhhŸhŰh Nubah}”(h]”h ]”h"]”h$]”h&]”j7 j.j9 hj; j< Œstart”Kuh1jùhjŠhžhhŸhŰh Meubjx)”}”(hŒ #define FOO(val) bar(index, val)”h]”hŒ #define FOO(val) bar(index, val)”…””}”hj’sbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh MghjŠhžhubhš)”}”(hŒ“puede parecer algo bueno, pero es confuso como el infierno cuando uno lee el cĂłdigo, y es propenso a romperse por cambios aparentemente inocentes.”h]”hŒ“puede parecer algo bueno, pero es confuso como el infierno cuando uno lee el cĂłdigo, y es propenso a romperse por cambios aparentemente inocentes.”…””}”(hjĄhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MkhjŠhžhubhš)”}”(hŒ’3) macros con argumentos que se usan como valores l: FOO(x) = y; le van a morder si alguien, por ejemplo, convierte FOO en una funciĂłn en lĂ­nea.”h]”hŒ’3) macros con argumentos que se usan como valores l: FOO(x) = y; le van a morder si alguien, por ejemplo, convierte FOO en una funciĂłn en lĂ­nea.”…””}”(hjŻhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MnhjŠhžhubhš)”}”(hŒÉ4) olvidarse de la precedencia: las macros que definen constantes usando expresiones deben encerrar la expresiĂłn entre parĂ©ntesis. Tenga cuidado con problemas similares con macros usando parĂĄmetros.”h]”hŒÉ4) olvidarse de la precedencia: las macros que definen constantes usando expresiones deben encerrar la expresiĂłn entre parĂ©ntesis. Tenga cuidado con problemas similares con macros usando parĂĄmetros.”…””}”(hjœhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MqhjŠhžhubjx)”}”(hŒ9#define CONSTANTE 0x4000 #define CONSTEXP (CONSTANTE | 3)”h]”hŒ9#define CONSTANTE 0x4000 #define CONSTEXP (CONSTANTE | 3)”…””}”hjËsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh MuhjŠhžhubhš)”}”(hŒu5) colisiones de espacio de nombres ("namespace") al definir variables locales en macros que se asemejan a funciones:”h]”hŒy5) colisiones de espacio de nombres (“namespace”) al definir variables locales en macros que se asemejan a funciones:”…””}”(hjÚhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MzhjŠhžhubjx)”}”(hŒÔ#define FOO(x) \ ({ \ typeof(x) ret; \ ret = calc_ret(x); \ (ret); \ })”h]”hŒÔ#define FOO(x) \ ({ \ typeof(x) ret; \ ret = calc_ret(x); \ (ret); \ })”…””}”hjèsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh M}hjŠhžhubhš)”}”(hŒret es un nombre comĂșn para una variable local -es menos probable que __foo_ret colisione (coincida) con una variable existente.”h]”hŒret es un nombre comĂșn para una variable local -es menos probable que __foo_ret colisione (coincida) con una variable existente.”…””}”(hjśhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M†hjŠhžhubhš)”}”(hŒ€El manual de cpp trata las macros de forma exhaustiva. El manual interno de gcc tambiĂ©n cubre RTL, que se usa frecuentemente con lenguaje ensamblador en el kernel.”h]”hŒ€El manual de cpp trata las macros de forma exhaustiva. El manual interno de gcc tambiĂ©n cubre RTL, que se usa frecuentemente con lenguaje ensamblador en el kernel.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M‰hjŠhžhubeh}”(h]”Œmacros-enums-y-rtl”ah ]”h"]”Œ12) macros, enums y rtl”ah$]”h&]”uh1jqhjshžhhŸhŰh M:ubjr)”}”(hhh]”(jw)”}”(hŒ 13) Imprimir mensajes del kernel”h]”hŒ 13) Imprimir mensajes del kernel”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhjhžhhŸhŰh MŽubhš)”}”(hX*A los desarrolladores del kernel les gusta ser vistos como alfabetizados. Cuide la ortografĂ­a de los mensajes del kernel para causar una buena impresiĂłn. No utilice contracciones incorrectas como ``dont``; use ``do not`` o ``don't`` en su lugar. Haga sus mensajes concisos, claros e inequĂ­vocos.”h]”(hŒÆA los desarrolladores del kernel les gusta ser vistos como alfabetizados. Cuide la ortografĂ­a de los mensajes del kernel para causar una buena impresiĂłn. No utilice contracciones incorrectas como ”…””}”(hj,hžhhŸNh Nubj)”}”(hŒ``dont``”h]”hŒdont”…””}”(hj4hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj,ubhŒ; use ”…””}”(hj,hžhhŸNh Nubj)”}”(hŒ ``do not``”h]”hŒdo not”…””}”(hjFhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj,ubhŒ o ”…””}”(hj,hžhhŸNh Nubj)”}”(hŒ ``don't``”h]”hŒdon't”…””}”(hjXhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj,ubhŒ@ en su lugar. Haga sus mensajes concisos, claros e inequĂ­vocos.”…””}”(hj,hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mhjhžhubhš)”}”(hŒ que debe usar para asegurarse de que los mensajes coincidan con el dispositivo correcto y driver, y estĂĄn etiquetados con el nivel correcto: dev_err(), dev_warn(), dev_info(), y asĂ­ sucesivamente. Para mensajes que no estĂĄn asociados con un dispositivo particular, define pr_notice(), pr_info(), pr_warn(), pr_err(), etc.”h]”hX€Hay varias modelos de macros de diagnĂłstico de driver en que debe usar para asegurarse de que los mensajes coincidan con el dispositivo correcto y driver, y estĂĄn etiquetados con el nivel correcto: dev_err(), dev_warn(), dev_info(), y asĂ­ sucesivamente. Para mensajes que no estĂĄn asociados con un dispositivo particular, define pr_notice(), pr_info(), pr_warn(), pr_err(), etc.”…””}”(hjŒhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mšhjhžhubhš)”}”(hX„Crear buenos mensajes de depuraciĂłn puede ser todo un desafĂ­o; y una vez los tiene, pueden ser de gran ayuda para la resoluciĂłn remota de problemas. Sin embargo, la impresiĂłn de mensajes de depuraciĂłn se maneja de manera diferente a la impresiĂłn de otros mensajes que no son de depuraciĂłn. Mientras que las otras funciones pr_XXX() se imprimen incondicionalmente, pr_debug() no lo hace; se compila fuera por defecto, a menos que DEBUG sea definido o se establezca CONFIG_DYNAMIC_DEBUG. Eso es cierto para dev_dbg() tambiĂ©n, y una convenciĂłn relacionada usa VERBOSE_DEBUG para agregar mensajes dev_vdbg() a los ya habilitados por DEBUG.”h]”hX„Crear buenos mensajes de depuraciĂłn puede ser todo un desafĂ­o; y una vez los tiene, pueden ser de gran ayuda para la resoluciĂłn remota de problemas. Sin embargo, la impresiĂłn de mensajes de depuraciĂłn se maneja de manera diferente a la impresiĂłn de otros mensajes que no son de depuraciĂłn. Mientras que las otras funciones pr_XXX() se imprimen incondicionalmente, pr_debug() no lo hace; se compila fuera por defecto, a menos que DEBUG sea definido o se establezca CONFIG_DYNAMIC_DEBUG. Eso es cierto para dev_dbg() tambiĂ©n, y una convenciĂłn relacionada usa VERBOSE_DEBUG para agregar mensajes dev_vdbg() a los ya habilitados por DEBUG.”…””}”(hjšhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MĄhjhžhubhš)”}”(hXdMuchos subsistemas tienen opciones de depuraciĂłn de Kconfig para activar -DDEBUG en el Makefile correspondiente; en otros casos, los archivos usan #define DEBUG. Y cuando un mensaje de depuraciĂłn debe imprimirse incondicionalmente, por ejemplo si es ya dentro de una secciĂłn #ifdef relacionada con la depuraciĂłn, printk(KERN_DEBUG ...) puede ser usado.”h]”hXdMuchos subsistemas tienen opciones de depuraciĂłn de Kconfig para activar -DDEBUG en el Makefile correspondiente; en otros casos, los archivos usan #define DEBUG. Y cuando un mensaje de depuraciĂłn debe imprimirse incondicionalmente, por ejemplo si es ya dentro de una secciĂłn #ifdef relacionada con la depuraciĂłn, printk(KERN_DEBUG ...) puede ser usado.”…””}”(hjšhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M«hjhžhubeh}”(h]”Œimprimir-mensajes-del-kernel”ah ]”h"]”Œ 13) imprimir mensajes del kernel”ah$]”h&]”uh1jqhjshžhhŸhŰh MŽubjr)”}”(hhh]”(jw)”}”(hŒ14) Reservando memoria”h]”hŒ14) Reservando memoria”…””}”(hjÁhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhjŸhžhhŸhŰh MČubhš)”}”(hX:El kernel proporciona los siguientes asignadores de memoria de propĂłsito general: kmalloc(), kzalloc(), kmalloc_array(), kcalloc(), vmalloc() y vzalloc(). Consulte la documentaciĂłn de la API para obtener mĂĄs informaciĂłn. a cerca de ellos. :ref:`Documentation/core-api/memory-allocation.rst `”h]”(hŒóEl kernel proporciona los siguientes asignadores de memoria de propĂłsito general: kmalloc(), kzalloc(), kmalloc_array(), kcalloc(), vmalloc() y vzalloc(). Consulte la documentaciĂłn de la API para obtener mĂĄs informaciĂłn. a cerca de ellos. ”…””}”(hjÏhžhhŸNh Nubh)”}”(hŒG:ref:`Documentation/core-api/memory-allocation.rst `”h]”hæ)”}”(hjÙh]”hŒ,Documentation/core-api/memory-allocation.rst”…””}”(hjÛhžhhŸNh Nubah}”(h]”h ]”(hńŒstd”Œstd-ref”eh"]”h$]”h&]”uh1hćhjŚubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hțŒ refdomain”jćŒreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆjŒmemory_allocation”uh1hhŸhŰh MŽhjÏubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MŽhjŸhžhubhš)”}”(hŒKLa forma preferida para pasar el tamaño de una estructura es la siguiente:”h]”hŒKLa forma preferida para pasar el tamaño de una estructura es la siguiente:”…””}”(hjęhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MșhjŸhžhubjx)”}”(hŒp = kmalloc(sizeof(*p), ...);”h]”hŒp = kmalloc(sizeof(*p), ...);”…””}”hj sbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh MŒhjŸhžhubhš)”}”(hXLa forma alternativa donde se deletrea el nombre de la estructura perjudica la legibilidad, y presenta una oportunidad para un error cuando se cambia el tipo de variable de puntero, pero el tamaño correspondiente de eso que se pasa a un asignador de memoria no.”h]”hXLa forma alternativa donde se deletrea el nombre de la estructura perjudica la legibilidad, y presenta una oportunidad para un error cuando se cambia el tipo de variable de puntero, pero el tamaño correspondiente de eso que se pasa a un asignador de memoria no.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MÀhjŸhžhubhš)”}”(hŒÁConvertir el valor devuelto, que es un puntero vacĂ­o, es redundante. La conversiĂłn desde el puntero vacĂ­o a cualquier otro tipo de puntero estĂĄ garantizado por la programaciĂłn en idioma C.”h]”hŒÁConvertir el valor devuelto, que es un puntero vacĂ­o, es redundante. La conversiĂłn desde el puntero vacĂ­o a cualquier otro tipo de puntero estĂĄ garantizado por la programaciĂłn en idioma C.”…””}”(hj(hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MĆhjŸhžhubhš)”}”(hŒ;La forma preferida para asignar una matriz es la siguiente:”h]”hŒ;La forma preferida para asignar una matriz es la siguiente:”…””}”(hj6hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MÉhjŸhžhubjx)”}”(hŒ'p = kmalloc_array(n, sizeof(...), ...);”h]”hŒ'p = kmalloc_array(n, sizeof(...), ...);”…””}”hjDsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh MËhjŸhžhubhš)”}”(hŒBLa forma preferida para asignar una matriz a cero es la siguiente:”h]”hŒBLa forma preferida para asignar una matriz a cero es la siguiente:”…””}”(hjShžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MÏhjŸhžhubjx)”}”(hŒ!p = kcalloc(n, sizeof(...), ...);”h]”hŒ!p = kcalloc(n, sizeof(...), ...);”…””}”hjasbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh MŃhjŸhžhubhš)”}”(hŒyAmbos casos verifican el desbordamiento en el tamaño de asignaciĂłn n * sizeof (...), y devuelven NULL si esto ocurriĂł.”h]”hŒyAmbos casos verifican el desbordamiento en el tamaño de asignaciĂłn n * sizeof (...), y devuelven NULL si esto ocurriĂł.”…””}”(hjphžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MŐhjŸhžhubhš)”}”(hŒćTodas estas funciones de asignaciĂłn genĂ©ricas emiten un volcado de pila (" stack dump") en caso de fallo cuando se usan sin __GFP_NOWARN, por lo que no sirve de nada emitir un mensaje de fallo adicional cuando se devuelva NULL.”h]”hŒéTodas estas funciones de asignaciĂłn genĂ©ricas emiten un volcado de pila (” stack dump”) en caso de fallo cuando se usan sin __GFP_NOWARN, por lo que no sirve de nada emitir un mensaje de fallo adicional cuando se devuelva NULL.”…””}”(hj~hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MŰhjŸhžhubeh}”(h]”Œreservando-memoria”ah ]”h"]”Œ14) reservando memoria”ah$]”h&]”uh1jqhjshžhhŸhŰh MČubjr)”}”(hhh]”(jw)”}”(hŒ15) La enfermedad de inline”h]”hŒ15) La enfermedad de inline”…””}”(hj—hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhj”hžhhŸhŰh MȚubhš)”}”(hXëParece haber una comĂșn percepciĂłn errĂłnea de que gcc tiene una magica opciĂłn "hazme mĂĄs rĂĄpido" de aceleraciĂłn, llamada ``inline`` (en lĂ­nea). Mientras que el uso de inlines puede ser apropiado (por ejemplo, como un medio para reemplazar macros, consulte el CapĂ­tulo 12), muy a menudo no lo es. El uso abundante de la palabra clave inline conduce a una mayor kernel, que a su vez ralentiza el sistema en su conjunto, debido a una mayor huella de icache para la CPU, y sencillamente porque hay menos memoria disponible para el pagecache. Solo piense en esto; un fallo en la memoria cachĂ© de la pĂĄgina provoca una bĂșsqueda de disco, que tarda fĂĄcilmente 5 milisegundos. Hay MUCHOS ciclos de CPU que puede entrar en estos 5 milisegundos.”h]”(hŒƒParece haber una comĂșn percepciĂłn errĂłnea de que gcc tiene una magica opciĂłn “hazme mĂĄs rĂĄpido” de aceleraciĂłn, llamada ”…””}”(hj„hžhhŸNh Nubj)”}”(hŒ ``inline``”h]”hŒinline”…””}”(hj­hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj„ubhXb (en lĂ­nea). Mientras que el uso de inlines puede ser apropiado (por ejemplo, como un medio para reemplazar macros, consulte el CapĂ­tulo 12), muy a menudo no lo es. El uso abundante de la palabra clave inline conduce a una mayor kernel, que a su vez ralentiza el sistema en su conjunto, debido a una mayor huella de icache para la CPU, y sencillamente porque hay menos memoria disponible para el pagecache. Solo piense en esto; un fallo en la memoria cachĂ© de la pĂĄgina provoca una bĂșsqueda de disco, que tarda fĂĄcilmente 5 milisegundos. Hay MUCHOS ciclos de CPU que puede entrar en estos 5 milisegundos.”…””}”(hj„hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Màhj”hžhubhš)”}”(hXŽUna razonable regla general es no poner funciones inline que tengan mĂĄs de 3 lĂ­neas de cĂłdigo en ellas. Una excepciĂłn a esta regla son los casos en que se sabe que un parĂĄmetro es una constante en tiempo de compilaciĂłn, y como resultado de esto, usted *sabe*, el compilador podrĂĄ optimizar la mayor parte de su funciĂłn en tiempo de compilaciĂłn. Para un buen ejemplo de este Ășltimo caso, vĂ©ase la funciĂłn en lĂ­nea kmalloc().”h]”(hXUna razonable regla general es no poner funciones inline que tengan mĂĄs de 3 lĂ­neas de cĂłdigo en ellas. Una excepciĂłn a esta regla son los casos en que se sabe que un parĂĄmetro es una constante en tiempo de compilaciĂłn, y como resultado de esto, usted ”…””}”(hjĆhžhhŸNh NubhŒemphasis”“”)”}”(hŒ*sabe*”h]”hŒsabe”…””}”(hjÏhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÍhjĆubhŒŹ, el compilador podrĂĄ optimizar la mayor parte de su funciĂłn en tiempo de compilaciĂłn. Para un buen ejemplo de este Ășltimo caso, vĂ©ase la funciĂłn en lĂ­nea kmalloc().”…””}”(hjĆhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mëhj”hžhubhš)”}”(hXÁA menudo, la gente argumenta que agregar funciones en lĂ­nea que son estĂĄticas y se usan solo una vez, es siempre una victoria ya que no hay perdida de espacio. Mientras esto es tĂ©cnicamente correcto, gcc es capaz de incorporarlos automĂĄticamente sin ayuda, y esta el problema de mantenimiento de eliminar el inline, cuando un segundo usuario supera el valor potencial de la pista que le dice a gcc que haga algo que habrĂ­a hecho de todos modos.”h]”hXÁA menudo, la gente argumenta que agregar funciones en lĂ­nea que son estĂĄticas y se usan solo una vez, es siempre una victoria ya que no hay perdida de espacio. Mientras esto es tĂ©cnicamente correcto, gcc es capaz de incorporarlos automĂĄticamente sin ayuda, y esta el problema de mantenimiento de eliminar el inline, cuando un segundo usuario supera el valor potencial de la pista que le dice a gcc que haga algo que habrĂ­a hecho de todos modos.”…””}”(hjçhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mòhj”hžhubeh}”(h]”Œla-enfermedad-de-inline”ah ]”h"]”Œ15) la enfermedad de inline”ah$]”h&]”uh1jqhjshžhhŸhŰh MȚubjr)”}”(hhh]”(jw)”}”(hŒ016) Valores devueltos por funciĂłn y sus nombres”h]”hŒ016) Valores devueltos por funciĂłn y sus nombres”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhjęhžhhŸhŰh Mûubhš)”}”(hXFLas funciones pueden devolver valores de muchos tipos diferentes, y uno de lo mĂĄs comĂșn es un valor que indica si la funciĂłn tuvo Ă©xito o ha fallado. Dicho valor se puede representar como un nĂșmero entero de cĂłdigo de error (-Exxx = falla, 0 = Ă©xito) o un booleano ``con Ă©xito`` (0 = falla, distinto de cero = Ă©xito).”h]”(hXLas funciones pueden devolver valores de muchos tipos diferentes, y uno de lo mĂĄs comĂșn es un valor que indica si la funciĂłn tuvo Ă©xito o ha fallado. Dicho valor se puede representar como un nĂșmero entero de cĂłdigo de error (-Exxx = falla, 0 = Ă©xito) o un booleano ”…””}”(hjhžhhŸNh Nubj)”}”(hŒ``con Ă©xito``”h]”hŒ con Ă©xito”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ( (0 = falla, distinto de cero = Ă©xito).”…””}”(hjhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Męhjęhžhubhš)”}”(hXGLa mezcla de estos dos tipos de representaciones es una fuente fĂ©rtil de errores difĂ­ciles de encontrar. Si el lenguaje C incluyera una fuerte distinciĂłn entre enteros y booleanos, el compilador encontrarĂ­a estos errores por nosotros... pero no lo hace. Para ayudar a prevenir tales errores, siga siempre esta convenciĂłn::”h]”hXFLa mezcla de estos dos tipos de representaciones es una fuente fĂ©rtil de errores difĂ­ciles de encontrar. Si el lenguaje C incluyera una fuerte distinciĂłn entre enteros y booleanos, el compilador encontrarĂ­a estos errores por nosotros... pero no lo hace. Para ayudar a prevenir tales errores, siga siempre esta convenciĂłn:”…””}”(hj.hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mhjęhžhubjx)”}”(hŒÚSi el nombre de una funciĂłn es una acciĂłn o un comando imperativo, la funciĂłn debe devolver un nĂșmero entero de cĂłdigo de error. si el nombre es un predicado, la funciĂłn debe devolver un valor booleano "exitoso".”h]”hŒÚSi el nombre de una funciĂłn es una acciĂłn o un comando imperativo, la funciĂłn debe devolver un nĂșmero entero de cĂłdigo de error. si el nombre es un predicado, la funciĂłn debe devolver un valor booleano "exitoso".”…””}”hj<sbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆuh1jwhŸhŰh M hjęhžhubhš)”}”(hXAPor ejemplo, ``agregar trabajo`` es un comando, y la funciĂłn agregar_trabajo() devuelve 0 en caso de Ă©xito o -EBUSY en caso de fracaso. De la misma manera, ``dispositivo PCI presente`` es un predicado, y la funciĂłn pci_dev_present() devuelve 1 si tiene Ă©xito en encontrar un dispositivo coincidente o 0 si no es asĂ­.”h]”(hŒ Por ejemplo, ”…””}”(hjJhžhhŸNh Nubj)”}”(hŒ``agregar trabajo``”h]”hŒagregar trabajo”…””}”(hjRhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjJubhŒ~ es un comando, y la funciĂłn agregar_trabajo() devuelve 0 en caso de Ă©xito o -EBUSY en caso de fracaso. De la misma manera, ”…””}”(hjJhžhhŸNh Nubj)”}”(hŒ``dispositivo PCI presente``”h]”hŒdispositivo PCI presente”…””}”(hjdhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjJubhŒ‡ es un predicado, y la funciĂłn pci_dev_present() devuelve 1 si tiene Ă©xito en encontrar un dispositivo coincidente o 0 si no es asĂ­.”…””}”(hjJhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M hjęhžhubhš)”}”(hŒÌTodas las funciones EXPORTed (exportadas) deben respetar esta convenciĂłn, al igual que todas las funciones publicas. Las funciones privadas (estĂĄticas) no lo necesitan, pero es recomendado que lo hagan.”h]”hŒÌTodas las funciones EXPORTed (exportadas) deben respetar esta convenciĂłn, al igual que todas las funciones publicas. Las funciones privadas (estĂĄticas) no lo necesitan, pero es recomendado que lo hagan.”…””}”(hj|hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mhjęhžhubhš)”}”(hXoLas funciones cuyo valor devuelto es el resultado real de un cĂĄlculo, en lugar de una indicaciĂłn de si el cĂłmputo tuvo Ă©xito, no estĂĄn sujetas a esta regla. Generalmente indican fallo al devolver valores fuera del rango de resultados. Los ejemplos tĂ­picos serĂ­an funciones que devuelven punteros; estos usan NULL o el mecanismo ERR_PTR para informar de fallos.”h]”hXoLas funciones cuyo valor devuelto es el resultado real de un cĂĄlculo, en lugar de una indicaciĂłn de si el cĂłmputo tuvo Ă©xito, no estĂĄn sujetas a esta regla. Generalmente indican fallo al devolver valores fuera del rango de resultados. Los ejemplos tĂ­picos serĂ­an funciones que devuelven punteros; estos usan NULL o el mecanismo ERR_PTR para informar de fallos.”…””}”(hjŠhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mhjęhžhubeh}”(h]”Œ+valores-devueltos-por-funcion-y-sus-nombres”ah ]”h"]”Œ016) valores devueltos por funciĂłn y sus nombres”ah$]”h&]”uh1jqhjshžhhŸhŰh Mûubjr)”}”(hhh]”(jw)”}”(hŒ17) Usando bool”h]”hŒ17) Usando bool”…””}”(hjŁhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhj hžhhŸhŰh Mubhš)”}”(hXHEl tipo bool del kernel Linux es un alias para el tipo C99 _Bool. Los valores booleanos pueden solo evaluar a 0 o 1, y la conversiĂłn implĂ­cita o explĂ­cita a bool convierte automĂĄticamente el valor en verdadero o falso. Cuando se utilizan tipos booleanos, !! no se necesita construcciĂłn, lo que elimina una clase de errores.”h]”hXHEl tipo bool del kernel Linux es un alias para el tipo C99 _Bool. Los valores booleanos pueden solo evaluar a 0 o 1, y la conversiĂłn implĂ­cita o explĂ­cita a bool convierte automĂĄticamente el valor en verdadero o falso. Cuando se utilizan tipos booleanos, !! no se necesita construcciĂłn, lo que elimina una clase de errores.”…””}”(hj±hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M hj hžhubhš)”}”(hŒmCuando se trabaja con valores booleanos, se deben usar las definiciones verdadera y falsa, en lugar de 1 y 0.”h]”hŒmCuando se trabaja con valores booleanos, se deben usar las definiciones verdadera y falsa, en lugar de 1 y 0.”…””}”(hjżhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M&hj hžhubhš)”}”(hŒùLos tipos de devoluciĂłn de funciĂłn bool y las variables de pila siempre se pueden usar cuando esto sea adecuado. Se recomienda el uso de bool para mejorar la legibilidad y, a menudo, es una mejor opciĂłn que 'int' para almacenar valores booleanos.”h]”hŒęLos tipos de devoluciĂłn de funciĂłn bool y las variables de pila siempre se pueden usar cuando esto sea adecuado. Se recomienda el uso de bool para mejorar la legibilidad y, a menudo, es una mejor opciĂłn que ‘int’ para almacenar valores booleanos.”…””•Ż|}”(hjÍhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M)hj hžhubhš)”}”(hŒüNo use bool si el diseño de la lĂ­nea de cachĂ© o el tamaño del valor son importantes, ya que su tamaño y la alineaciĂłn varĂ­a segĂșn la arquitectura compilada. Las estructuras que son optimizadas para la alineaciĂłn y el tamaño no debe usar bool.”h]”hŒüNo use bool si el diseño de la lĂ­nea de cachĂ© o el tamaño del valor son importantes, ya que su tamaño y la alineaciĂłn varĂ­a segĂșn la arquitectura compilada. Las estructuras que son optimizadas para la alineaciĂłn y el tamaño no debe usar bool.”…””}”(hjÛhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M.hj hžhubhš)”}”(hŒšSi una estructura tiene muchos valores verdadero/falso, considere consolidarlos en un bitfield con miembros de 1 bit, o usando un tipo de ancho fijo apropiado, como u8.”h]”hŒšSi una estructura tiene muchos valores verdadero/falso, considere consolidarlos en un bitfield con miembros de 1 bit, o usando un tipo de ancho fijo apropiado, como u8.”…””}”(hjéhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M3hj hžhubhš)”}”(hX'De manera similar, para los argumentos de funciĂłn, se pueden consolidar muchos valores verdaderos/falsos en un solo argumento bit a bit 'flags' y 'flags' a menudo, puede ser una alternativa de argumento mĂĄs legible si los sitios de llamada tienen constantes desnudas de tipo verdaderas/falsas.”h]”hX/De manera similar, para los argumentos de funciĂłn, se pueden consolidar muchos valores verdaderos/falsos en un solo argumento bit a bit ‘flags’ y ‘flags’ a menudo, puede ser una alternativa de argumento mĂĄs legible si los sitios de llamada tienen constantes desnudas de tipo verdaderas/falsas.”…””}”(hjśhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M7hj hžhubhš)”}”(hŒbDe lo contrario, el uso limitado de bool en estructuras y argumentos puede mejorar la legibilidad.”h]”hŒbDe lo contrario, el uso limitado de bool en estructuras y argumentos puede mejorar la legibilidad.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M<hj hžhubeh}”(h]”Œ usando-bool”ah ]”h"]”Œ17) usando bool”ah$]”h&]”uh1jqhjshžhhŸhŰh Mubjr)”}”(hhh]”(jw)”}”(hŒ&18) No reinvente las macros del kernel”h]”hŒ&18) No reinvente las macros del kernel”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhjhžhhŸhŰh M@ubhš)”}”(hŒùEl archivo de cabecera include/linux/kernel.h contiene una serie de macros que debe usar, en lugar de programar explĂ­citamente alguna variante de estos por usted mismo. Por ejemplo, si necesita calcular la longitud de una matriz, aproveche la macro”h]”hŒùEl archivo de cabecera include/linux/kernel.h contiene una serie de macros que debe usar, en lugar de programar explĂ­citamente alguna variante de estos por usted mismo. Por ejemplo, si necesita calcular la longitud de una matriz, aproveche la macro”…””}”(hj,hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MBhjhžhubjx)”}”(hŒ2#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))”h]”hŒ2#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))”…””}”hj:sbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh MGhjhžhubhš)”}”(hŒZDe manera similar, si necesita calcular el tamaño de algĂșn miembro de la estructura, use”h]”hŒZDe manera similar, si necesita calcular el tamaño de algĂșn miembro de la estructura, use”…””}”(hjIhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MKhjhžhubjx)”}”(hŒ/#define sizeof_field(t, f) (sizeof(((t*)0)->f))”h]”hŒ/#define sizeof_field(t, f) (sizeof(((t*)0)->f))”…””}”hjWsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh MNhjhžhubhš)”}”(hŒïTambiĂ©n hay macros min() y max() que realizan una verificaciĂłn estricta de tipos si lo necesita. SiĂ©ntase libre de leer detenidamente ese archivo de encabezado para ver quĂ© mĂĄs ya estĂĄ definido y que no debe reproducir en su cĂłdigo.”h]”hŒïTambiĂ©n hay macros min() y max() que realizan una verificaciĂłn estricta de tipos si lo necesita. SiĂ©ntase libre de leer detenidamente ese archivo de encabezado para ver quĂ© mĂĄs ya estĂĄ definido y que no debe reproducir en su cĂłdigo.”…””}”(hjfhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MRhjhžhubeh}”(h]”Œ"no-reinvente-las-macros-del-kernel”ah ]”h"]”Œ&18) no reinvente las macros del kernel”ah$]”h&]”uh1jqhjshžhhŸhŰh M@ubjr)”}”(hhh]”(jw)”}”(hŒ'19) Editores modeline y otros desastres”h]”hŒ'19) Editores modeline y otros desastres”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhj|hžhhŸhŰh MXubhš)”}”(hŒÊAlgunos editores pueden interpretar la informaciĂłn de configuraciĂłn incrustada en los archivos fuente, indicado con marcadores especiales. Por ejemplo, emacs interpreta las lĂ­neas marcadas como esto:”h]”hŒÊAlgunos editores pueden interpretar la informaciĂłn de configuraciĂłn incrustada en los archivos fuente, indicado con marcadores especiales. Por ejemplo, emacs interpreta las lĂ­neas marcadas como esto:”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MZhj|hžhubjx)”}”(hŒ-*- mode: c -*-”h]”hŒ-*- mode: c -*-”…””}”hj›sbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh M^hj|hžhubhš)”}”(hŒO asĂ­:”h]”hŒO asĂ­:”…””}”(hjȘhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mbhj|hžhubjx)”}”(hŒK/* Local Variables: compile-command: "gcc -DMAGIC_DEBUG_FLAG foo.c" End: */”h]”hŒK/* Local Variables: compile-command: "gcc -DMAGIC_DEBUG_FLAG foo.c" End: */”…””}”hjžsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh Mdhj|hžhubhš)”}”(hŒ.Vim interpreta los marcadores que se ven asĂ­:”h]”hŒ.Vim interpreta los marcadores que se ven asĂ­:”…””}”(hjÇhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mlhj|hžhubjx)”}”(hŒ/* vim:set sw=8 noet */”h]”hŒ/* vim:set sw=8 noet */”…””}”hjŐsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh Mnhj|hžhubhš)”}”(hX`No incluya ninguno de estos en los archivos fuente. La gente tiene sus propias configuraciones del editor, y sus archivos de origen no deben anularlos. Esto incluye marcadores para sangrĂ­a y configuraciĂłn de modo. La gente puede usar su propio modo personalizado, o puede tener algĂșn otro mĂ©todo mĂĄgico para que la sangrĂ­a funcione correctamente.”h]”hX`No incluya ninguno de estos en los archivos fuente. La gente tiene sus propias configuraciones del editor, y sus archivos de origen no deben anularlos. Esto incluye marcadores para sangrĂ­a y configuraciĂłn de modo. La gente puede usar su propio modo personalizado, o puede tener algĂșn otro mĂ©todo mĂĄgico para que la sangrĂ­a funcione correctamente.”…””}”(hjähžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mrhj|hžhubeh}”(h]”Œ#editores-modeline-y-otros-desastres”ah ]”h"]”Œ'19) editores modeline y otros desastres”ah$]”h&]”uh1jqhjshžhhŸhŰh MXubjr)”}”(hhh]”(jw)”}”(hŒ20) Ensamblador inline”h]”hŒ20) Ensamblador inline”…””}”(hjęhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhjúhžhhŸhŰh Mzubhš)”}”(hXVEn el cĂłdigo especĂ­fico de arquitectura, es posible que deba usar ensamblador en lĂ­nea para interactuar con funcionalidades de CPU o plataforma. No dude en hacerlo cuando sea necesario. Sin embargo, no use ensamblador en lĂ­nea de forma gratuita cuando C puede hacer el trabajo. Puede y debe empujar el hardware desde C cuando sea posible.”h]”hXVEn el cĂłdigo especĂ­fico de arquitectura, es posible que deba usar ensamblador en lĂ­nea para interactuar con funcionalidades de CPU o plataforma. No dude en hacerlo cuando sea necesario. Sin embargo, no use ensamblador en lĂ­nea de forma gratuita cuando C puede hacer el trabajo. Puede y debe empujar el hardware desde C cuando sea posible.”…””}”(hj hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M|hjúhžhubhš)”}”(hŒÙConsidere escribir funciones auxiliares simples que envuelvan bits comunes de ensamblador, en lugar de escribirlos repetidamente con ligeras variaciones. Recuerde que el ensamblador en lĂ­nea puede usar parĂĄmetros C.”h]”hŒÙConsidere escribir funciones auxiliares simples que envuelvan bits comunes de ensamblador, en lugar de escribirlos repetidamente con ligeras variaciones. Recuerde que el ensamblador en lĂ­nea puede usar parĂĄmetros C.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M‚hjúhžhubhš)”}”(hŒáLas funciones de ensamblador grandes y no triviales deben ir en archivos .S, con su correspondientes prototipos de C definidos en archivos de encabezado en C. Los prototipos de C para el ensamblador deben usar ``asmlinkage``.”h]”(hŒÒLas funciones de ensamblador grandes y no triviales deben ir en archivos .S, con su correspondientes prototipos de C definidos en archivos de encabezado en C. Los prototipos de C para el ensamblador deben usar ”…””}”(hj'hžhhŸNh Nubj)”}”(hŒ``asmlinkage``”h]”hŒ asmlinkage”…””}”(hj/hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj'ubhŒ.”…””}”(hj'hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M†hjúhžhubhš)”}”(hŒïEs posible que deba marcar su declaraciĂłn asm como volĂĄtil, para evitar que GCC la elimine si GCC no nota ningĂșn efecto secundario. No siempre es necesario hacerlo, sin embargo, y hacerlo innecesariamente puede limitar la optimizaciĂłn.”h]”hŒïEs posible que deba marcar su declaraciĂłn asm como volĂĄtil, para evitar que GCC la elimine si GCC no nota ningĂșn efecto secundario. No siempre es necesario hacerlo, sin embargo, y hacerlo innecesariamente puede limitar la optimizaciĂłn.”…””}”(hjGhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MŠhjúhžhubhš)”}”(hX1Al escribir una sola declaraciĂłn de ensamblador en lĂ­nea que contiene mĂșltiples instrucciones, ponga cada instrucciĂłn en una lĂ­nea separada en una string separada, y termine cada string excepto la Ășltima con ``\n\t`` para indentar correctamente la siguiente instrucciĂłn en la salida en ensamblador:”h]”(hŒÖAl escribir una sola declaraciĂłn de ensamblador en lĂ­nea que contiene mĂșltiples instrucciones, ponga cada instrucciĂłn en una lĂ­nea separada en una string separada, y termine cada string excepto la Ășltima con ”…””}”(hjUhžhhŸNh Nubj)”}”(hŒ``\n\t``”h]”hŒ\n\t”…””}”(hj]hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjUubhŒS para indentar correctamente la siguiente instrucciĂłn en la salida en ensamblador:”…””}”(hjUhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mhjúhžhubjx)”}”(hŒqasm ("magic %reg1, #42\n\t" "more_magic %reg2, %reg3" : /* outputs */ : /* inputs */ : /* clobbers */);”h]”hŒqasm ("magic %reg1, #42\n\t" "more_magic %reg2, %reg3" : /* outputs */ : /* inputs */ : /* clobbers */);”…””}”hjusbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh M•hjúhžhubeh}”(h]”Œensamblador-inline”ah ]”h"]”Œ20) ensamblador inline”ah$]”h&]”uh1jqhjshžhhŸhŰh Mzubjr)”}”(hhh]”(jw)”}”(hŒ21) CompilaciĂłn condicional”h]”hŒ21) CompilaciĂłn condicional”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhjŒhžhhŸhŰh Mœubhš)”}”(hXUSiempre que sea posible, no use condicionales de preprocesador (#if, #ifdef) en archivos .c; de lo contrario, el cĂłdigo es mĂĄs difĂ­cil de leer y la lĂłgica mĂĄs difĂ­cil de seguir. En cambio, use dichos condicionales en un archivo de encabezado que defina funciones para usar en esos archivos .c, proporcionando versiones de cĂłdigo auxiliar sin operaciĂłn en el caso #else, y luego llame a estas funciones incondicionalmente desde archivos .c. El compilador evitarĂĄ generar cualquier cĂłdigo para las llamadas restantes, produciendo resultados idĂ©nticos, pero la lĂłgica es fĂĄcil de seguir.”h]”hXUSiempre que sea posible, no use condicionales de preprocesador (#if, #ifdef) en archivos .c; de lo contrario, el cĂłdigo es mĂĄs difĂ­cil de leer y la lĂłgica mĂĄs difĂ­cil de seguir. En cambio, use dichos condicionales en un archivo de encabezado que defina funciones para usar en esos archivos .c, proporcionando versiones de cĂłdigo auxiliar sin operaciĂłn en el caso #else, y luego llame a estas funciones incondicionalmente desde archivos .c. El compilador evitarĂĄ generar cualquier cĂłdigo para las llamadas restantes, produciendo resultados idĂ©nticos, pero la lĂłgica es fĂĄcil de seguir.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MžhjŒhžhubhš)”}”(hX Prefiera compilar funciones completas, en lugar de porciones de funciones o porciones de expresiones. En lugar de poner un ifdef en una expresiĂłn, divida la totalidad de la expresiĂłn con una funciĂłn de ayuda independiente y aplique el condicional a esa funciĂłn.”h]”hX Prefiera compilar funciones completas, en lugar de porciones de funciones o porciones de expresiones. En lugar de poner un ifdef en una expresiĂłn, divida la totalidad de la expresiĂłn con una funciĂłn de ayuda independiente y aplique el condicional a esa funciĂłn.”…””}”(hj«hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M§hjŒhžhubhš)”}”(hX^Si tiene una funciĂłn o variable que puede potencialmente quedar sin usar en una configuraciĂłn en particular, y el compilador advertirĂ­a sobre su definiciĂłn sin usar, marque la definiciĂłn como __maybe_unused en lugar de envolverla en un preprocesador condicional. (Sin embargo, si una funciĂłn o variable *siempre* acaba sin ser usada, bĂłrrela.)”h]”(hX5Si tiene una funciĂłn o variable que puede potencialmente quedar sin usar en una configuraciĂłn en particular, y el compilador advertirĂ­a sobre su definiciĂłn sin usar, marque la definiciĂłn como __maybe_unused en lugar de envolverla en un preprocesador condicional. (Sin embargo, si una funciĂłn o variable ”…””}”(hjčhžhhŸNh NubjÎ)”}”(hŒ *siempre*”h]”hŒsiempre”…””}”(hjÁhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÍhjčubhŒ acaba sin ser usada, bĂłrrela.)”…””}”(hjčhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MŹhjŒhžhubhš)”}”(hŒŻDentro del cĂłdigo, cuando sea posible, use la macro IS_ENABLED para convertir un sĂ­mbolo Kconfig en una expresiĂłn booleana de C, y utilĂ­celo en un condicional de C normal:”h]”hŒŻDentro del cĂłdigo, cuando sea posible, use la macro IS_ENABLED para convertir un sĂ­mbolo Kconfig en una expresiĂłn booleana de C, y utilĂ­celo en un condicional de C normal:”…””}”(hjÙhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MČhjŒhžhubjx)”}”(hŒ1if (IS_ENABLED(CONFIG_SOMETHING)) { ... }”h]”hŒ1if (IS_ENABLED(CONFIG_SOMETHING)) { ... }”…””}”hjçsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh M¶hjŒhžhubhš)”}”(hXEl compilador "doblarĂĄ"" constantemente el condicional e incluirĂĄ o excluirĂĄ el bloque de cĂłdigo al igual que con un #ifdef, por lo que esto no agregarĂĄ ningĂșn tiempo de gastos generales en ejecuciĂłn. Sin embargo, este enfoque todavĂ­a permite que el compilador de C vea el cĂłdigo dentro del bloque, y verifique que sea correcto (sintaxis, tipos, sĂ­mbolo, referencias, etc.). Por lo tanto, aĂșn debe usar un #ifdef si el cĂłdigo dentro del bloque hace referencia a sĂ­mbolos que no existirĂĄn si no se cumple la condiciĂłn.”h]”hXEl compilador “doblará”” constantemente el condicional e incluirĂĄ o excluirĂĄ el bloque de cĂłdigo al igual que con un #ifdef, por lo que esto no agregarĂĄ ningĂșn tiempo de gastos generales en ejecuciĂłn. Sin embargo, este enfoque todavĂ­a permite que el compilador de C vea el cĂłdigo dentro del bloque, y verifique que sea correcto (sintaxis, tipos, sĂ­mbolo, referencias, etc.). Por lo tanto, aĂșn debe usar un #ifdef si el cĂłdigo dentro del bloque hace referencia a sĂ­mbolos que no existirĂĄn si no se cumple la condiciĂłn.”…””}”(hjöhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MŒhjŒhžhubhš)”}”(hŒÊAl final de cualquier bloque #if o #ifdef no trivial (mĂĄs de unas pocas lĂ­neas), incluya un comentario despuĂ©s de #endif en la misma lĂ­nea, anotando la expresiĂłn condicional utilizada. Por ejemplo:”h]”hŒÊAl final de cualquier bloque #if o #ifdef no trivial (mĂĄs de unas pocas lĂ­neas), incluya un comentario despuĂ©s de #endif en la misma lĂ­nea, anotando la expresiĂłn condicional utilizada. Por ejemplo:”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MÄhjŒhžhubjx)”}”(hŒ9#ifdef CONFIG_SOMETHING ... #endif /* CONFIG_SOMETHING */”h]”hŒ9#ifdef CONFIG_SOMETHING ... #endif /* CONFIG_SOMETHING */”…””}”hjsbah}”(h]”h ]”h"]”h$]”h&]”j‡jˆj‰‰jŠj‹jŒ}”uh1jwhŸhŰh MÈhjŒhžhubeh}”(h]”Œcompilacion-condicional”ah ]”h"]”Œ21) compilaciĂłn condicional”ah$]”h&]”uh1jqhjshžhhŸhŰh Mœubjr)”}”(hhh]”(jw)”}”(hŒ22) No rompa el kernel”h]”hŒ22) No rompa el kernel”…””}”(hj,hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhj)hžhhŸhŰh MÏubhš)”}”(hŒhEn general, la decisiĂłn de romper el kernel pertenece al usuario, mĂĄs que al desarrollador del kernel.”h]”hŒhEn general, la decisiĂłn de romper el kernel pertenece al usuario, mĂĄs que al desarrollador del kernel.”…””}”(hj:hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MŃhj)hžhubjr)”}”(hhh]”(jw)”}”(hŒEvite el panic()”h]”hŒEvite el panic()”…””}”(hjKhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhjHhžhhŸhŰh MŐubhš)”}”(hŒżpanic() debe usarse con cuidado y principalmente solo durante el arranque del sistema. panic() es, por ejemplo, aceptable cuando se queda sin memoria durante el arranque y no puede continuar.”h]”hŒżpanic() debe usarse con cuidado y principalmente solo durante el arranque del sistema. panic() es, por ejemplo, aceptable cuando se queda sin memoria durante el arranque y no puede continuar.”…””}”(hjYhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MŚhjHhžhubeh}”(h]”Œevite-el-panic”ah ]”h"]”Œevite el panic()”ah$]”h&]”uh1jqhj)hžhhŸhŰh MŐubjr)”}”(hhh]”(jw)”}”(hŒUse WARN() en lugar de BUG()”h]”hŒUse WARN() en lugar de BUG()”…””}”(hjrhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhjohžhhŸhŰh MÜubhš)”}”(hXJNo agregue cĂłdigo nuevo que use cualquiera de las variantes BUG(), como BUG(), BUG_ON() o VM_BUG_ON(). En su lugar, use una variante WARN*(), preferiblemente WARN_ON_ONCE(), y posiblemente con cĂłdigo de recuperaciĂłn. El cĂłdigo de recuperaciĂłn no es requerido si no hay una forma razonable de recuperar, al menos parcialmente.”h]”hXJNo agregue cĂłdigo nuevo que use cualquiera de las variantes BUG(), como BUG(), BUG_ON() o VM_BUG_ON(). En su lugar, use una variante WARN*(), preferiblemente WARN_ON_ONCE(), y posiblemente con cĂłdigo de recuperaciĂłn. El cĂłdigo de recuperaciĂłn no es requerido si no hay una forma razonable de recuperar, al menos parcialmente.”…””}”(hj€hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MȚhjohžhubhš)”}”(hŒŐ"Soy demasiado perezoso para tener en cuenta los errores" no es una excusa para usar BUG(). Importantes corrupciones internas sin forma de continuar aĂșn pueden usar BUG(), pero necesitan una buena justificaciĂłn.”h]”hŒÙ“Soy demasiado perezoso para tener en cuenta los errores” no es una excusa para usar BUG(). Importantes corrupciones internas sin forma de continuar aĂșn pueden usar BUG(), pero necesitan una buena justificaciĂłn.”…””}”(hjŽhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mähjohžhubeh}”(h]”Œuse-warn-en-lugar-de-bug”ah ]”h"]”Œuse warn() en lugar de bug()”ah$]”h&]”uh1jqhj)hžhhŸhŰh MÜubjr)”}”(hhh]”(jw)”}”(hŒ1Use WARN_ON_ONCE() en lugar de WARN() o WARN_ON()”h]”hŒ1Use WARN_ON_ONCE() en lugar de WARN() o WARN_ON()”…””}”(hj§hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhj€hžhhŸhŰh Méubhš)”}”(hXGGeneralmente, se prefiere WARN_ON_ONCE() a WARN() o WARN_ON(), porque es comĂșn que una condiciĂłn de advertencia dada, si ocurre, ocurra varias veces. Esto puede llenar el registro del kernel, e incluso puede ralentizar el sistema lo suficiente como para que el registro excesivo se convierta en su propio, adicional problema.”h]”hXGGeneralmente, se prefiere WARN_ON_ONCE() a WARN() o WARN_ON(), porque es comĂșn que una condiciĂłn de advertencia dada, si ocurre, ocurra varias veces. Esto puede llenar el registro del kernel, e incluso puede ralentizar el sistema lo suficiente como para que el registro excesivo se convierta en su propio, adicional problema.”…””}”(hj”hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mëhj€hžhubeh}”(h]”Œ+use-warn-on-once-en-lugar-de-warn-o-warn-on”ah ]”h"]”Œ1use warn_on_once() en lugar de warn() o warn_on()”ah$]”h&]”uh1jqhj)hžhhŸhŰh Méubjr)”}”(hhh]”(jw)”}”(hŒNo haga WARN a la ligera”h]”hŒNo haga WARN a la ligera”…””}”(hjÎhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhjËhžhhŸhŰh Mòubhš)”}”(hXőWARN*() estĂĄ diseñado para situaciones inesperadas que nunca deberĂ­an suceder. Las macros WARN*() no deben usarse para nada que se espera que suceda durante un funcionamiento normal. No hay "checkeos" previos o posteriores a la condiciĂłn, por ejemplo. De nuevo: WARN*() no debe usarse para una condiciĂłn esperada que vaya a activarse fĂĄcilmente, por ejemplo, mediante acciones en el espacio del usuario. pr_warn_once() es una alternativa posible, si necesita notificar al usuario de un problema.”h]”hXùWARN*() estĂĄ diseñado para situaciones inesperadas que nunca deberĂ­an suceder. Las macros WARN*() no deben usarse para nada que se espera que suceda durante un funcionamiento normal. No hay “checkeos” previos o posteriores a la condiciĂłn, por ejemplo. De nuevo: WARN*() no debe usarse para una condiciĂłn esperada que vaya a activarse fĂĄcilmente, por ejemplo, mediante acciones en el espacio del usuario. pr_warn_once() es una alternativa posible, si necesita notificar al usuario de un problema.”…””}”(hjÜhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh MôhjËhžhubeh}”(h]”Œno-haga-warn-a-la-ligera”ah ]”h"]”Œno haga warn a la ligera”ah$]”h&]”uh1jqhj)hžhhŸhŰh Mòubjr)”}”(hhh]”(jw)”}”(hŒ.No se preocupe sobre panic_on_warn de usuarios”h]”hŒ.No se preocupe sobre panic_on_warn de usuarios”…””}”(hjőhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhjòhžhhŸhŰh Męubhš)”}”(hXbAlgunas palabras mĂĄs sobre panic_on_warn: Recuerde que ``panic_on_warn`` es una opciĂłn disponible del kernel, y que muchos usuarios configuran esta opciĂłn. Esta es la razĂłn por la que hay un artĂ­culo de "No haga WARN a la ligera", arriba. Sin embargo, la existencia de panic_on_warn de usuarios no es una razĂłn vĂĄlida para evitar el uso juicioso de WARN*(). Esto se debe a que quien habilita panic_on_warn, explĂ­citamente pidiĂł al kernel que fallara si se dispara un WARN*(), y tales usuarios deben estar preparados para afrontar las consecuencias de un sistema que es algo mĂĄs probable que se rompa.”h]”(hŒ8Algunas palabras mĂĄs sobre panic_on_warn: Recuerde que ”…””}”(hjhžhhŸNh Nubj)”}”(hŒ``panic_on_warn``”h]”hŒ panic_on_warn”…””}”(hj hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhX es una opciĂłn disponible del kernel, y que muchos usuarios configuran esta opciĂłn. Esta es la razĂłn por la que hay un artĂ­culo de “No haga WARN a la ligera”, arriba. Sin embargo, la existencia de panic_on_warn de usuarios no es una razĂłn vĂĄlida para evitar el uso juicioso de WARN*(). Esto se debe a que quien habilita panic_on_warn, explĂ­citamente pidiĂł al kernel que fallara si se dispara un WARN*(), y tales usuarios deben estar preparados para afrontar las consecuencias de un sistema que es algo mĂĄs probable que se rompa.”…””}”(hjhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh Mÿhjòhžhubeh}”(h]”Œ.no-se-preocupe-sobre-panic-on-warn-de-usuarios”ah ]”h"]”Œ.no se preocupe sobre panic_on_warn de usuarios”ah$]”h&]”uh1jqhj)hžhhŸhŰh Męubjr)”}”(hhh]”(jw)”}”(hŒ` del kernel, por greg@kroah.com at OLS 2002: http://www.kroah.com/linux/talks/ols_2002_kernel_codingstyle_talk/html/”h]”(h)”}”(hŒ-:ref:`process/coding-style.rst `”h]”hæ)”}”(hjÇh]”hŒprocess/coding-style.rst”…””}”(hjÉhžhhŸNh Nubah}”(h]”h ]”(hńŒstd”Œstd-ref”eh"]”h$]”h&]”uh1hćhjĆubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hțŒ refdomain”jÓŒreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆjŒ codingstyle”uh1hhŸhŰh M"hjÁubhŒ del kernel, por ”…””}”(hjÁhžhhŸNh Nubj6)”}”(hŒgreg@kroah.com”h]”hŒgreg@kroah.com”…””}”(hjéhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:greg@kroah.com”uh1j5hjÁubhŒ at OLS 2002: ”…””}”(hjÁhžhhŸNh Nubj6)”}”(hŒGhttp://www.kroah.com/linux/talks/ols_2002_kernel_codingstyle_talk/html/”h]”hŒGhttp://www.kroah.com/linux/talks/ols_2002_kernel_codingstyle_talk/html/”…””}”(hjęhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jÿuh1j5hjÁubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhŰh M"hjZhžhubeh}”(h]”Œapendice-i-referencias”ah ]”h"]”ŒapĂ©ndice i) referencias”ah$]”h&]”uh1jqhjshžhhŸhŰh Mubeh}”(h]”(Œ$estilo-en-el-codigo-del-kernel-linux”jpeh ]”h"]”(Œ%estilo en el cĂłdigo del kernel linux”Œsp_codingstyle”eh$]”h&]”uh1jqhhhžhhŸhŰh K Œexpect_referenced_by_name”}”j jesŒexpect_referenced_by_id”}”jpjesubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hŰuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(jvNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jJŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hی _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”jp]”jeasŒnameids”}”(j jpjjjjjj~j§j€jŸjœjAj>jv js jljijdjajS jP j jjȚjÛj=j:jźj«j‡j„jjj»jžj‘jŽjújśjjšjjjyjvjśjôj‰j†j&j#jWjTjljijĄjžjÈjĆjïjìj(j%jOjLjjuŒ nametypes”}”(j ˆj‰j‰j‰j§‰jŸ‰jA‰jv ‰jl‰jd‰jS ˆj ‰jȚ‰j=‰jź‰j‡‰j‰j»‰j‘‰jú‰j‰j‰jy‰jś‰j‰‰j&‰jW‰jl‰jĄ‰jȉjï‰j(‰jO‰j‰uh}”(jpjsjjsjjÄj~jj€j„jœj j>jȘjs jDjijy jajń jP jJ jjojÛjj:jáj«j@j„j±jjŠjžjjŽjŸjśj”jšjęjj jvjjôj|j†júj#jŒjTj)jijHjžjojĆj€jìjËj%jòjLj+jjZuŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”hŒsystem_message”“”)”}”(hhh]”hš)”}”(hŒ:Enumerated list start value not ordinal-1: "2" (ordinal 2)”h]”hŒ>Enumerated list start value not ordinal-1: “2” (ordinal 2)”…””}”(hjČhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hjŻubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”ŒINFO”Œsource”hیline”K uh1j­hjŠhžhhŸhŰh MeubaŒtransform_messages”]”jź)”}”(hhh]”hš)”}”(hhh]”hŒ4Hyperlink target "sp-codingstyle" is not referenced.”…””}”hjĐsbah}”(h]”h ]”h"]”h$]”h&]”uh1h§hjÍubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”jÈŒsource”hیline”Kuh1j­ubaŒ transformer”NŒ include_log”]”Œ9Documentation/translations/sp_SP/process/coding-style.rst”(NNNNt”†”aŒ decoration”Nhžhub.