可以在main中声明的主访问变量中声明的函数吗?

时间:2013-12-24 13:04:57

标签: c

我有一个我在主要名为Edges中声明和初始化的数组。

我还在main中声明了一些访问名为Edges的数组的函数。

代码编译和工作。

为什么会这样?我认为在main中声明的变量不是全局变量。

编辑:请参阅Sourav的代码。

4 个答案:

答案 0 :(得分:4)

实际上,如果在函数内部声明一个函数,则内部函数只对外部函数可见,而不在global范围内。因此,您和内部函数[适当的,代码块]声明的变量具有相同的范围。因此,访问变量没有问题。

检查一下

#include <stdio.h>
#include <stdlib.h>

int innerfunc();

int main()
{

        int outer = 5;
        int innerfunc()
        {
                printf("outer is %d\n", outer);
        }
        innerfunc();
        return 0;
}

输出

[sourav@infba01383 so_overflow]# ./a.out 
outer is 5
[sourav@infba01383 so_overflow]#

答案 1 :(得分:2)

您无法在C中的函数内声明函数。这意味着您无法在main内声明函数。使用-pedantic标志编译代码,您肯定会看到此警告;

[Warning] ISO C forbids nested functions [-Wpedantic]  

我编译了这段代码

#include <stdio.h>

void void print(int *);

int main()
{
    int a[2] = {1,3};

    void print(int *a)
    {
         printf("%d", *a);
    }
    print(a);
    return 0;
}  

并收到警告

 [Warning] ISO C forbids nested functions [-Wpedantic]  

答案 2 :(得分:1)

首先,正如大多数答案所提到的,它是一个gcc扩展;不属于标准C.
以下答案严格限于gcc。

gcc会将它们视为任何其他功能。

e.g。检查以下代码:
(我冒昧地扩展你的代码如下:)

#include <stdio.h>
#include <stdlib.h>

typedef int operation(int num1, int num2); // for function pointer...

operation* getOperation(char oper)
{
    int a=10;
    int add(int x, int y){return x+y+a;}
    int sub(int x, int y){return x-y+a;}
    int nop(int x, int y){return a;}

    if(oper=='+')return add;
    if(oper=='-')return sub;
    return nop;
}

int main()
{
    operation *my_op;

    my_op=getOperation('+');
    printf("%d\n",my_op(5,3));

    my_op=getOperation('-');
    printf("%d\n",my_op(5,3));

    return 0;

}

如果您使用gcc -S&amp;编译它检查生成的汇编代码,它会显示

  1. 功能 - getOperation&amp; main - 转换为汇编,没有任何名称更改。因此,可以从任何函数(在此文件中或甚至从其他文件中调用)来调用它们。

    e.g.
    .globl  getOperation /*This line will be missing in case of static functions.*/
    .type   getOperation, @function
    
  2. 函数 - addsubnop - 将转换为具有一些唯一随机后缀的程序集。

    e.g.
    /*No .globl line is printed here.*/
    .type   add.2685, @function
    
  3. 由于名称已更改,因此您无法从其他功能中调用它们。只有'父函数'(在这种情况下为getOperation)具有函数名称的信息。 (有关详细信息,请查看c variable scope。)

    但是,您可以使用函数指针在其他函数中使用它们,如上面的代码所示。

    关于getOperation中的局部变量(例如a):使用addsub / nop / rbp访问这些变量注册。
    提示:使用gcc -S编译一个包含“本地函数”的小代码,以了解究竟发生了什么......: - )

答案 3 :(得分:0)

嵌套函数(annonymouse函数)不是c标准库的一部分,有一个可以使用的扩展。

您可以声明全局变量并在整个程序中使用它们。


Sourav实际上是正确的,您可以声明该函数,但其​​范围仅限于main