'extern'关键字的作用是什么使以下代码合法?

时间:2016-02-04 20:01:56

标签: c++ c global-variables extern

为什么以下代码会编译? 'num'变量何时获得其值?

<html>
    <body>
        <div data-ng-controller="SimpleController">
            Name :
            <br />
            <input type="text" data-ng-model="name" placeholder="Enter Your Name " /> {{ name }}
            <br />

            <ul>
                <li data-ng-repeat="cust in customers | filter:name | orderBy:'city' ">
                    {{ cust.name | uppercase }} - {{ cust.city | lowercase }}
                </li>
            </ul>
        </div>
        <script src="angular.min.js"></script>
        <script>
            function SimpleController($scope) {
                $scope.customers = [
                    {
                        name: 'Rishabh Shrivas',
                        city: 'New Delhi'
                    },
                    {
                        name: 'Rishabh Bharadawaj',
                        city: 'Noida'
                    },
                    {
                        name: 'Rishabh Sen',
                        city: 'Gurgaon'
                    }
                ];
            }
        </script>
    </body>
</html>

示例:Live Code

4 个答案:

答案 0 :(得分:2)

在您的代码中,

 extern int num;

被称为声明。 OTOH,

int num = 3;

是显式初始化的定义。此语句设置值。该值在编译时决定,并在main()开始执行之前设置。

尽管如此,void main()应该是int main(void),至少要符合标准。

答案 1 :(得分:2)

它的工作原理是因为你声明了num所以它可以在函数的代码中命名,并且因为你在命名空间范围内定义它所以它在静态初始化时初始化时间,就在执行main之前。

从这个意义上说,你目前编写的程序与以下几乎无法区分:

#include <stdio.h>

int num = 3;

void main()
{
    printf("%d", num); //prints 3
}

“在哪里”初始化变量并不是特别相关,只要在您尝试使用它之前及时发生。

顺便说一下,您必须main返回int,而不是void

答案 2 :(得分:1)

extern标记了稍后定义的变量的声明。定义int num = 3;部分实际上是为变量分配内存并设置它的值(它也是声明的两倍)。 C / C ++是在使用前声明的,如果你没有这样做extern int num;那么num将不会在你使用它时声明。您当然也可以删除extern行,并将num的定义移至main()以上。

这里有两件事情可以发挥作用。在编译期间,必须在使用之前在源文件中的某个点声明num。至于何时获得它的值,则在程序加载期间出现。文件范围内的所有变量(在任何函数之外)如num都分配了内存,如果在调用main()之前初始化了它们的值。如果他们的定义中没有给出值,则可能包含任何内容,因此不要对未初始化变量的值进行任何假设。您也不能对它们初始化的顺序做任何假设,因此在初始化这样的变量时不要引用其他文件范围变量。

答案 3 :(得分:0)

extern与声明一起使用。它告诉编译器该东西将在别处定义。当您有多个文件使用相同的变量或函数时,它很有用。您可以在头文件中放置extern声明,并在源文件中定义共享变量/函数。

如果您从代码中删除extern,则会定义num两次,这是不允许的。要删除extern声明,只需将int num = 3;放在文件的顶部即可。