Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数中是否有函数声明的用途?_C++_C_Declaration - Fatal编程技术网

C++ 函数中是否有函数声明的用途?

C++ 函数中是否有函数声明的用途?,c++,c,declaration,C++,C,Declaration,我们可以在函数中声明函数(我想要一个局部变量,但它解析为函数声明): 是唯一的原因,因为它使解析器更简单,并且“因为标准是这样说的”,或者是有一个模糊的用法吗? < P>这是一个真正的C问题,因为这个行为是直接从C继承的(尽管它在C++中受到了更多的压力,因为最令人烦恼的解析)。 我怀疑答案(至少在C的上下文中)是这样的:这允许您将函数声明的存在范围精确地限定到需要它们的地方。在C语言的早期,这可能很有用。我怀疑现在是否还有人这样做,但为了向后兼容,不能将其从语言中删除。如果需要使用名称与当前翻

我们可以在函数中声明函数(我想要一个局部变量,但它解析为函数声明):


是唯一的原因,因为它使解析器更简单,并且“因为标准是这样说的”,或者是有一个模糊的用法吗?

< P>这是一个真正的C问题,因为这个行为是直接从C继承的(尽管它在C++中受到了更多的压力,因为最令人烦恼的解析)。
我怀疑答案(至少在C的上下文中)是这样的:这允许您将函数声明的存在范围精确地限定到需要它们的地方。在C语言的早期,这可能很有用。我怀疑现在是否还有人这样做,但为了向后兼容,不能将其从语言中删除。

如果需要使用名称与当前翻译单元(源文件)中的内部(静态)函数或变量冲突的外部函数,这很有用。例如(很傻,但它能让人明白这一点):

唯一的原因是“因为 解析器更简单,因为 标准是这样说的。”

是的,基本上

任何可以成为函数声明的东西都是函数声明


不幸的是,这是一种“只是”的情况。

另一个函数中的函数声明隐藏了其他重载函数。e、 g.第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;
}
#包括
无效f(int);
int main(){
空f(字符*);
f(10);//第7行
f(“你好世界”);
返回0;
}
空f(整数a){

std::cout显然,在C中伪造名称空间是有用的。@Martinho:但这不是为什么。在那时,全局名称空间是函数的唯一名称空间。它现在是如何工作的?作为单个标识符的函数声明是与其包含函数的名称空间相匹配的,还是与全局名称空间相匹配的?你能声明名称空间函数吗?它是st不太有用。因为函数原型仅限于它在其中声明的函数的范围,所以可以引用外部函数和符号,而不会实际污染全局命名空间(使用
#include
)考虑当一个人想调用一个头文件中声明的函数,同时避免其包含并允许外部代码包含它而不发生冲突时的情况。对于极其跛行的头文件集(例如,代码> Windows .H./COD>和家庭)这是特别有用的。嗯,对于GCC,我得到的是一个错误,试图重新定义FoE中的读。你不需要在C++中使用一个静态函数,而不是匿名的命名空间。如果你用一个“错误的名字”创建的函数,那就是你的借口。不是重命名你的函数…它真的是冒险。@ AlxiSkyk:这个问题被标记为C和C++,C中肯定是正确的方法。我同意这是很差的标记,但是我甚至没有注意C++标签。所以在新声明之前不会调用任何代码“<代码> f(10)< /代码>?
static int read(int x)
{
    return bar(x);
}

static int foo()
{
    ssize_t read(int, void *, size_t);
    read(0, buf, 1);
}
#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;
}