c++ - tipos - funciones predefinidas en c
¿Hay un uso para declaraciones de funciones dentro de funciones? (4)
Podemos declarar funciones dentro de las funciones (quería una variable local, pero se analiza como una declaración de función):
struct bvalue;
struct bdict {
bdict(bvalue);
}
struct bvalue {
explict operator bdict() const;
}
struct metainfo {
metainfo(bdict);
}
void foo(bvalue v) {
metainfo mi(bdict(v)); // parses as function declaration
metainfo mi = bdict(v); // workaround
// (this workaround doesn''t work in the presence of explicit ctors)
}
¿Son las únicas razones "porque hace que el analizador sea más simple" y "porque la norma así lo dice", o hay un uso oscuro para esto?
Son las únicas razones "porque hace que el analizador sea más simple" y "porque la norma lo dice"
Sí, básicamente.
Todo lo que puede ser una declaración de función, es una declaración de función.
Desafortunadamente es uno de esos casos "solo es".
Es útil si necesita usar una función externa cuyo nombre podría entrar en conflicto con una función o variable interna (estática) en la unidad de traducción actual (archivo fuente). Por ejemplo (tonto pero consigue el punto a través):
static int read(int x)
{
return bar(x);
}
static int foo()
{
ssize_t read(int, void *, size_t);
read(0, buf, 1);
}
Esta es realmente una pregunta de C, porque este comportamiento se heredó directamente de C (aunque recibe mucha más presión en C ++ debido al análisis más desconcertante ).
Sospecho que la respuesta (al menos en el contexto de C) es que esto le permite ampliar la existencia de sus declaraciones de funciones a donde se necesitan. Tal vez eso fue útil en los primeros días de C. Dudo que alguien haga eso más, pero por razones de compatibilidad con versiones anteriores no se puede eliminar del lenguaje.
Una declaración de función dentro de otra función oculta otras funciones sobrecargadas. por ejemplo, error del compilador en la línea 7
#include <iostream>
void f(int);
int main() {
void f(char *);
f(10); // Line 7
f("Hello world");
return 0;
}
void f(int a) {
std::cout << a;
}
void f(char *str) {
std::cout << str;
}