2011-01-03 26 views
22

Sé que el número mínimo de parámetros en la definición de función es cero, pero ¿cuál es el número máximo de parámetros en la definición de función? Estoy haciendo la pregunta solo por el conocimiento y por curiosidad, no es que vaya a escribir una función real.Número máximo de parámetros en la declaración de función

+2

Tales límites siempre se definen en la documentación de su compilador. IOW necesita nombrar un compilador particular para obtener los números exactos. Estos son grandes para uso común. Varias políticas de codificación sugieren no realizar funciones con más de 5 argumentos (mucho menos de lo que normalmente se permite). –

Respuesta

34

Sí, hay límites impuestos por la implementación. Su respuesta se da en el texto en negrita en el siguiente extracto del Estándar de C++.

1. lenguaje C++


Anexo B - cantidades de implementación

  1. Porque las computadoras son finitos, C + + implementaciones son inevitablemente limitados en el tamaño de los programas pueden procesar con éxito. Cada implementación de debe documentar esas limitaciones donde se conozca. límites Esta documentación puede citar fijos cuando existan, decir cómo calcular límites variables en función de los recursos disponibles , o decir que límites fijos no existen o son desconocidos.

  2. Los límites pueden limitar las cantidades que incluyen las que se describen a continuación o otras. El número entre corchetes que sigue a cada cantidad se recomienda como el mínimo para esa cantidad. Sin embargo, estas cantidades son solo pautas y no determinan el cumplimiento.
    - Jerarquizar niveles de declaraciones compuestas, estructuras de control de iteración y estructuras de control de selección [256].
    - Niveles de anidamiento de la condición condicional inclusión [256].
    - Puntero, matriz y declaradores de función (en cualquier combinación ) que modifican una estructura aritmética, , unión o tipo incompleto en una declaración [256].
    - Anidando niveles de expresiones entre paréntesis dentro de una expresión completa [256].
    - Número de caracteres en un identificador o macro nombre interno [1 024].
    - Número de caracteres en un identificador externo [1 024].
    - Externa identificadores en una unidad de traducción [65 536].
    - Identificadores con el bloque alcance declarado en un bloque [1 024].
    - Identificadores de macro simultáneamente definidos en una unidad de traducción [65 536].
    - Parámetros en una función definición [256].
    - Argumentos en una llamada de función [256].

    - Parámetros en una definición de macro [256].
    - Argumentos en una macro invocación [256].
    - Caracteres en una línea lógica de origen [65 536].
    - Los caracteres en una cadena de caracteres literales o anchas cadena literal (después de la concatenación) [65] 536.
    - Tamaño de un objeto [262 144].
    - Niveles de anidamiento para #include archivos [256]. las etiquetas de caso de una declaración interruptor (excluyendo los de cualquier sentencias switch anidados) [16 384] -
    .
    - Miembros de datos en una sola clase, estructura o unión [16 384].
    - Constantes de enumeración en una sola enumeración [4 096].
    - Niveles de clase anidada, estructura, o la unión definiciones en un solo struct-declaración-list [256].
    - Funciones registradas por atexit() [32].
    - Clases base directas e indirectas [16 384].
    - Clases base directas para una clase simple [1024].
    - Miembros declarados en una sola clase [4 096].
    - Funciones virtuales de anulación final en una clase, accesible o no [16 384].
    - Bases virtuales directas e indirectas de una clase [1 024].
    - Miembros estáticos de una clase [1 024].
    - Declaraciones de amistad en una clase [4 096].
    - Declaraciones de control de acceso en una clase [4 096].
    - Inicializadores de miembros en una definición de constructor [6 144].
    - Scope cualificaciones de un identificador [256].
    - Anidado externo especificaciones [1 024].
    - Plantilla argumentos en una declaración de plantilla [1 024].
    - Plantilla anidada recursivamente instanciaciones [17].
    - Controladores por try block [256].
    - Tirar especificaciones en una sola función declaración [256].

Además, también dice en $ 18.3/6,

límites de implementación: La implementación deberán soportar el registro de al menos 32 funciones.

+0

¿Tienes un enlace al estándar en línea? – Yttrill

+0

@Yttrill ANSI e ISO ganan dinero vendiendo copias del Estándar. No está disponible gratuitamente; si necesita el Estándar, usted (o su empleador) debe pagar. Sin embargo, hay borradores de pre-finalización disponibles si eso es lo suficientemente bueno para sus propósitos. No conozco ningún borrador C++, pero los estándares del borrador C se pueden encontrar buscando en Google 'n1256'. –

+0

¿Qué significa exactamente "Tamaño de un objeto"? ¿Eso incluye los datos encapsulados, o es solo por la suma de los tamaños de los tipos (muchos OFs)? – adam10603

4

Por supuesto, si usted está escribiendo una función en C con un gran número de argumentos tales, que probablemente desee volver a pensar el diseño de su programa.

+1

Si está escribiendo una función de C++ con más de un argumento, probablemente debería estar gritando en el Comité para hacer que las tuplas sean más fáciles de usar :) – Yttrill

+4

Esta es la mejor respuesta. El máximo es "más de lo que debería usar". –

+8

Hice esta pregunta por curiosidad. – Nawaz

20

2. Lenguaje C


5.2.4.1 Límites de traducción


La aplicación deberá ser capaz de traducir y ejecutaral menos un programa que contiene al menos una instancia de cada uno de los siguientes límites:
- 127 niveles de anidamiento de bloques
- 63 niveles de anidamiento de inclusión condicional
- 12 puntero, matriz y fu declaradores ncio (en cualquier combinación) modificar un aritmética, estructura, unión, o tipo incompleto en una declaración
- 63 niveles de anidamiento de declaradores entre paréntesis dentro de un declarador completo
- 63 niveles de anidamiento de las expresiones entre paréntesis dentro de una expresión completa
- 63 caracteres iniciales significativas en un identificador interno o un nombre de macro (cada nombre de carácter universal o carácter fuente extendida se considera un único carácter)
- 31 caracteres iniciales significativos en un identificador externo (cada nombre de carácter universal
especificando una identificador corto de 0000FFFF o menos es consi dered 6 caracteres, cada nombre de carácter universal especificando un identificador corto de 00.010.000 o más es considerados 10 caracteres, y cada carácter fuente extendida se considera la misma número de caracteres como el correspondiente nombre de carácter universal, en su caso)
- 4095 identificadores externos en una unidad de traducción
- 511 identificadores con alcance bloque declaradas en un bloque
- 4095 identificadores de macro simultáneamente definidos en la unidad de traducción uno de preprocesamiento
- 127 parámetros en una definición de función
- 127 argumentos en una llamada de función

- 127 parámetros en una definición de macro
- 127 argumentos en una invocación macro
- 4095 caracteres en una línea de fuente lógica
- 4095 caracteres en una cadena de caracteres literales o cadena amplia literal (después de la concatenación)
- 65535 bytes en un objeto (en un entorno alojado solamente)
- 15 niveles de anidamiento de archivos #include
- 1023 etiquetas de caso de una sentencia switch (excluyendo los de cualquier interruptor anidada declaraciones)
- 1023 miembros en un solo estructura o unión
- 1023 constantes de enumeración en una sola enumeración
- 63 niv eles de estructura o unión anidados definiciones en una única estructura de declaración de lista

Sin embargo, se dice en las notas que,

13 Las implementaciones deben evitar imponer límites de traducción fijos siempre que sea posible.

+0

¿Tiene algún enlace para esta documentación? –

+2

@ Mr.32: Google para 'C language standard n1256'. En la búsqueda, obtuve este enlace: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf – Nawaz

+0

gracias hermano ............ –

5

Como que responden anteriores han señalado de manera adecuada, el número de parámetros depende del compilador de C++. El límite del compilador puede deberse a las limitaciones impuestas por los entornos de hardware.

Por ejemplo, el VAX CPU architecture utiliza un campo de 8 bits que contiene el número de argumentos, por lo que el código VAX compatible no puede pasar más de 255 parámetros.

Del mismo modo, muchos procesadores pequeños como el Intel 8048 family están tan limitados para la memoria que la mayoría de los compiladores de C y C++ dan pena si se usan más de cuatro parámetros. Si bien muchos desarrolladores convencionales pueden despreciar al 8048, sus descendientes siguen siendo una de las CPU más implementadas, principalmente en dispositivos integrados.

Muchas implementaciones de arquitectura RISC especifican un método de paso de parámetros usando registros, en lugar de la pila. Una CPU ARM básica, por ejemplo, solo tiene 16 registros. La cantidad máxima de parámetros podría depender de las opciones de línea de comandos del compilador que afectan la forma en que genera el código para pasar los parámetros. Tal vez más de ocho son empujados a una pila. Tal vez no.

Si esos ejemplos parecen excesivamente restrictivos, considere que el Palm OS limited a C funciona con un solo parámetro, y que tenía que ser de tipo int o void *.

Cuestiones relacionadas