¿Cuál es el significado de char foo(|10|) en C?

3 minutos de lectura

avatar de usuario de gbronner
gbronner

Soy un programador de C con mucha experiencia, pero recientemente encontré un código en un mainframe que tiene una variable local. Esto está en una función C simple que declara esta variable, y luego strcpy / strcats dos cuerdas en él, y luego intenta un fopen.

char foo(|10|);

Este código es muy antiguo. Posiblemente incluso K&R C viejo. Me pregunto si se trata de una oscura extensión del compilador o de una adaptación a un teclado que no tiene [] o algo así.

¿Alguien sabe si esta declaración es ‘especial’?

Este es un mainframe Z/OS estándar. No estoy seguro de qué compilador se usa.

  • Es un mainframe de IBM… ¿es posible que la codificación de caracteres sea EBCDIC? Si hay que creer en Wikipedia, carecía de la [ ] caracteres, por lo que un compilador de C destinado a trabajar en la fuente EBCDIC bien puede haber tenido que definir algún sustituto.

    – Nate Eldredge

    15 de diciembre a las 4:39

  • … aunque C define secuencias de trígrafos exactamente para ese propósito. Pero tal vez esa sea una alternativa no estándar / preestándar.

    – John Bollinger

    15 de diciembre a las 4:43

  • @NateEldredge Podría ser, pero esa página también muestra | como no necesariamente presente.

    – dbush

    15 de diciembre a las 4:44


  • Esta pregunta también sería bien recibida en Retrocomputing.SE

    – OmarL

    15 de diciembre a las 16:07

Parece ser una forma temprana o no estándar de dígrafo. El código probablemente fue escrito usando EBCDIC en lugar de ASCII, y EBCDIC no tiene [ ] caracteres (al menos no en todas las páginas de códigos).

Encontré la manual para sas/c, un compilador de C aparentemente destinado a System/370. En la página 2-10 (página 42 del pdf) puede ver que enumeran (| |) como “formas alternativas” para [ ].

(Aunque aparentemente | tampoco está en todas las páginas de códigos; pero tal vez estaba en una página de códigos que se usaba más comúnmente. No sé.)

C99 también incluyó dígrafos (y trigrafos) para resolver el mismo problema, pero usaron <: :> como los dígrafos, y ??( ??) para los trigrafos.

  • Esto parece ser correcto. Una búsqueda en Google Books arrojó un fragmento apenas legible de Diario del Dr. Dobb de 1993 que indicaba que MVS EBCDIC no admitía [ and ] y los digrafos (| y |) en su lugar.

    – sj95126

    15 de diciembre a las 5:05


  • Se agregaron dígrafos al estándar C en C95 (ISO 9899/AMD1:1995).

    – Lundin

    15 de diciembre a las 7:39

  • Gracias, esto salió de un mainframe de conjunto de caracteres ebcdic. Había oído hablar de los trígrafos (¡y lo comprobé!), ¡pero nunca antes había oído hablar de los dígrafos en código C!

    – gbronner

    15 de diciembre a las 17:46

  • Los trígrafos se eliminaron en el estándar C++17. Todos los principales compiladores todavía tienen Opcional apoyo para ellos, sin embargo.

    – dan04

    15 de diciembre a las 19:48

  • Pero @dan04 esta pregunta es sobre el lenguaje C, no sobre C++.

    – fabspro

    17 dic a las 11:30

¿Ha sido útil esta solución?