C中的重复声明全局变量

时间:2018-01-15 18:56:33

标签: c variables duplicates global declaration

为什么这在全球范围内有效:

use warnings;
use strict;
use feature 'say';

use XML::LibXML;

my $file = shift @ARGV || 'Get_All_Prime.xml'

my $reader = XML::LibXML->new();
my $doc = $reader->load_xml(location => $file, no_blanks => 1);

my $xpath = '//ns3:searchResult/ns3:resources/ns5:resource/link';

my @links;
foreach my $node ($doc->findnodes($xpath)) {
    push @links, $node->findvalue('./@href');
}
say for @links;

但不在函数体内:

<link ...>

使用clion 2017.3.1,C99,gcc5.4

2 个答案:

答案 0 :(得分:3)

全局范围中的第一个是所谓Tentative definition的示例。

  

暂定定义是没有初始化程序的外部声明,没有存储类说明符或指定符静态。

     

暂定定义是可能会或可能不会作为定义的声明。如果在同一翻译单元中较早或较晚发现实际外部定义,则暂定定义仅作为声明。

在第二个示例中,b具有阻止范围且没有链接,换句话说:声明不是外部。因此,暂定定义规则不适用。

答案 1 :(得分:1)

在第一个代码段中,您拥有C调用暂定定义和外部定义的内容:

  

C11, 6.9.2p2)&#34;具有没有初始化程序的文件范围且没有存储类说明符或存储类说明符为静态的对象的标识符声明构成暂定定义。 [...]&#34;

在第二个代码段中,您不在文件范围但在块范围内,这是不允许的原因。