есть ли ограничение длины для имен переменных g ++? - PullRequest
17 голосов
/ 21 апреля 2010

см. Заголовок

Ответы [ 3 ]

19 голосов
/ 21 апреля 2010

Краткий ответ: Нет

Длинный ответ: Да, он должен быть достаточно маленьким, чтобы поместиться в памяти, но в противном случае нет, не совсем.Если есть встроенный лимит (я не верю, что он есть), он настолько велик, что вам будет очень трудно его достичь.

На самом деле, вы действительно заинтересовали меня, поэтому я создал следующееПрограмма Python для генерации кода:

#! /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]));

Это генерирует код C ++, используя имя переменной требуемой длины.Используя следующее:

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

Вышесказанное не доставляет мне проблем (имя переменной составляет примерно 1 МБ в длину).Я пытался получить гигабайт, но я не настолько умён с конструкцией строки, и поэтому я решил прервать, когда gencpp.py занял слишком много времени.

В любом случае, я очень сомневаюсь, что gcc предварительно выделяет1 МБ для имен переменных.Это чисто ограничено памятью.

4 голосов
/ 21 апреля 2010

дополнительная ошибка, некоторые линкеры имеют ограничение на длину искаженного имени. как правило, это проблема с шаблонами и вложенными классами, превышающими длину идентификатора, но любая из них может вызвать проблему

2 голосов
/ 21 апреля 2010

Я не знаю, что такое предел (или если он есть), но я думаю, что это хорошая практика, чтобы он был, чтобы поймать патологический код, например, созданный генератором убегающего кода. Для чего это стоит, стандарт C ++ предлагает минимум 1 КБ для длины идентификатора.

...