2010-04-21 14 views

Respuesta

17

Respuesta corta:
No

Respuesta larga:
Sí, tiene que ser lo suficientemente pequeño para que quepa en la memoria, pero de lo contrario no, en realidad no. Si hay un límite incorporado (no creo que exista) es tan grande que sería muy difícil alcanzarlo.

En realidad, me tienes mucha curiosidad, así que creé el siguiente programa de Python para generar código:

#! /usr/bin/env python2.6 
import sys; 
cppcode=""" 
#include <iostream> 
#include <cstdlib> 

int main(int argc, char* argv[]) 
{ 
    int %s = 0; 
    return 0; 
} 
""" 

def longvarname(n): 
    str="x"; 
    for i in xrange(n): 
     str = str+"0"; 
    return str; 

def printcpp(n): 
    print cppcode % longvarname(n); 

if __name__=="__main__": 
    if len(sys.argv)==2: 
     printcpp(int(sys.argv[1])); 

Esto genera código C++ utilizando el nombre de la variable longitud deseada. Uso de lo siguiente:

 
./gencpp.py 1048576 > main.cpp 
g++ main.cpp -o main 

Lo anterior no me da problemas (el nombre de la variable es de aproximadamente 1 MB de longitud). Intenté por un gigabyte, pero no estoy siendo tan inteligente con la construcción de cuerdas, así que decidí abortar cuando gencpp.py demoró demasiado.

De todos modos, dudo mucho que gcc preasigne 1MB para nombres variables. Está puramente limitado por la memoria.

+0

Hice algo similar antes de esto - Publicaré el código (está en otra máquina), pero básicamente es una función de python que generó código C++ con 2 variables con un último carácter diferente para garantizar que los nombres que long son distintos. Llegué a 64k y pensé que eso era suficiente. No probado con 1Mb sin embargo. –

+1

en mi win32 mingw el compilador/'ld' no puede vincular tu muestra – mbx

2

No sé cuál es el límite (o si hay uno), pero creo que es una buena práctica que exista uno, para detectar el código patológico, por ejemplo, el creado por un generador de código fuera de control . Por lo que vale, el estándar C++ sugiere un mínimo de 1 K para la longitud del identificador.

+0

@Neil, no creo que sea responsabilidad del compilador atrapar el generador de código fuera de control. Permitir una duración arbitraria según lo permitan las duras restricciones de recursos parece lo más sensato para mí. –

4

un gotcha adicional, algunos enlaces tienen un límite en la longitud del nombre destrozado. esto tiende a ser un problema con la plantilla y las clases anidadas más que la longitud del identificador, pero cualquiera podría desencadenar un problema afaik

Cuestiones relacionadas