2011-12-19 21 views
5

Estaba buscando el código fuente de tiempo de ejecución de google go (en https://go.googlecode.com/hg/src/pkg/runtime/), y parece que usan un caracter especial para los nombres de sus funciones, ·. (Consulte, por ejemplo, https://go.googlecode.com/hg/src/pkg/runtime/cgocall.c). ¿Es esto aceptado en los principales compiladores? No es ANSI C, ¿verdad? ¿O es solo algo de macro magia?Caracteres no ASCII en C

¡Gracias!

+0

Al observar el ejemplo, me acabo de dar cuenta de que el símbolo aparece solo entre el tiempo de ejecución y algún otro nombre ('runtime · cgocall',' runtime · throw', 'runtime · allm'). – pmg

+0

@pmg: Se usa como un identificador de espacio de nombres, que creo que es muy inteligente, muy bueno y muy inconveniente de usar. –

+2

Hmm, esto * sí * parece ser una forma bastante inteligente de simular espacios de nombres en ANSI C. Con suerte, las respuestas exploran lo que podría ser una advertencia al hacerlo, en lugar de solo decirle cuál es el personaje. –

Respuesta

5

C90 no permite caracteres adicionales en el identificador (sobre aquellos en el conjunto de caracteres básicos), C99 do (ambos con la sintaxis de caracteres universales - \ uXXXX y \ UXXXXXXXX - y un conjunto definido de implementación de otros caracteres) .

6.4.2.1/1 en C99:

identifier: 
    identifier-nondigit 
    identifier identifier-nondigit 
    identifier digit 
identifier-nondigit: 
    nondigit 
    universal-character-name 
    other implementation-defined characters 
nondigit: one of 
    _ a b c d e f g h i j k l m 
    n o p q r s t u v w x y z 
    A B C D E F G H I J K L M 
    N O P Q R S T U V W X Y Z 
digit: one of 
    0 1 2 3 4 5 6 7 8 9 

No sé lo bien que se apoya en las implementaciones de C, sé que Plan9 compilador de C could handle other characters antes de ser estandarizada.

+0

incluso en identificadores? ¿O solo dentro de cadenas? – Waneck

+0

Incluso en identificadores. Vea la cita que acabo de agregar. – AProgrammer

+0

Hrm, sí. Esto me hace pensar que el compilador de C de Microsoft tampoco puede manejarlo, ya que nunca se han molestado en dar soporte a C99. –

2

¿Te refieres al punto? Es el código de carácter 183 de ISO 8859-1 (ISO Latin-1) - es un código ASCII extendido que corresponde (aparentemente) a la coma georgiana, también conocida como "punto medio". En realidad es un personaje legal.

+0

¿Está definido en el estándar ANSI? – Waneck

+0

@Waneck: es, en el conjunto de caracteres extendido, http://ascii-table.com/ansi-codes.php. Número ANSI 183. – Thomas

+0

Está codificado en utf-8 como 0xC2 0xB7. – pmg

1

The C99 Standard "permite" (para valores suficientemente pequeños de "permitir") 'caracteres extraños'

5.1.1.2 fases de traducción

1 La precedencia entre las reglas de sintaxis de la traducción es especificado por el siguiendo fases.

  1. personajes archivo de origen de varios bytes físicos se asignan, en una implementación definen forma, al conjunto de caracteres de origen (la introducción de caracteres de nueva línea de indicadores de fin de línea) si es necesario. Las secuencias de Trigraph se reemplazan por representaciones internas de un solo carácter correspondientes.
1

Usando ese punto medio se discute aquí:

http://code.google.com/p/go/issues/detail?id=793

Básicamente, el uso de ese punto no es parte de la especificación, pero hay algunos casos en que sea necesario. Bootstrapping, runtime o assembly.

+0

No entiendo. ¿Cómo/por qué es necesario para poner en marcha el sistema? ¿Estás hablando del idioma Go, tal vez, en lugar del código C vinculado por la pregunta? –

+0

Creo que este problema se relaciona con los identificadores de google go, no con los identificadores de C. Es por eso que deben estar hablando de arrancar el compilador. – Waneck

+0

La forma en que lo entiendo es que, como ya existen funciones que usan el punto medio, Go necesita hacer llamadas a esas funciones usando ese punto medio en cgocall.c para llamar. – Derek

Cuestiones relacionadas