相关疑难解决方法(0)

关于暂定定义

我读了一本关于试探性定义的书,

暂定定义是没有存储类说明符且没有初始化程序的任何外部数据声明.如果到达翻译单元的末尾并且没有出现具有标识符的初始化器的定义,则暂定定义变为完整定义

请解释上述声明的含义.还有,声明和定义之间的区别?由于这个原因我混淆了.:(为什么这个程序没有错误:

#include <stdio.h>

int a;      //Tentative definition
int a;      //similarly this declaration too.
int main()  //not getting any error with this code why its so?
{
    printf("hi");
} 
Run Code Online (Sandbox Code Playgroud)

此外,此代码有什么问题:

#include<stdio.h>
printf("Hi");
int main(void){
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c

34
推荐指数
2
解决办法
7319
查看次数

C中允许重新定义,但C++中不允许重新定义?

为什么这段代码在C中工作但在C++中不工作?

int i = 5;
int i; // but if I write int i = 5; again I get error in C also

int main(){

  // using i
}
Run Code Online (Sandbox Code Playgroud)

c c++ declaration

33
推荐指数
2
解决办法
1539
查看次数

C99中的暂定定义和链接

考虑由两个文件组成的C程序,

在f1.c:

int x;
Run Code Online (Sandbox Code Playgroud)

f2.c:

int x=2;
Run Code Online (Sandbox Code Playgroud)

对C99标准第6.9.2段的解读是该程序应该被拒绝.在我对6.9.2的解释中,变量x是暂定的f1.c,但是这个暂定的定义在翻译单元的末尾变成了一个实际的定义,并且(在我看来),应该表现得好像f1.c包含了定义int x=0;.

对于所有编译器(以及重要的是,链接器)我能够尝试,这不是发生的事情.我试过的所有编译平台都链接了上面两个文件,两个文件中的值x都是2.

我怀疑这是偶然发生的,或者只是作为标准要求提供的"简单"功能.如果你考虑一下,这意味着链接器中对那些没有初始化器的全局变量有特殊支持,而不是那些显式初始化为零的全局变量.有人告诉我,无论如何编译Fortran可能都需要链接器功能.那将是一个合理的解释.

有什么想法吗?对标准的其他解释?文件f1.cf2.c拒绝链接在一起的平台名称?

注意:这很重要,因为问题出现在静态分析的上下文中.如果这两个文件可能拒绝在某个平台上链接,分析器应该抱怨,但是如果每个编译平台都接受它,那么就没有理由对它进行警告.

c fortran static-analysis compilation c99

32
推荐指数
3
解决办法
5146
查看次数

为什么在C中的2个文件中无法定义变量两次

为什么我不能拥有一个; 在2个C文件中.我打算将两者结合起来制作可执行文件.我从经验中知道我不能,但我想找到标准C99所说的位置并密封我的理解.

我正在阅读http://www.open-std.org/jtc1/sc22/wg...docs/n1256.pdf中的 ISO C99标准.它在第42页说:

6.2.2识别者的联系

1可以通过一个称为连接的过程,在不同的范围或相同的范围内多次声明一个标识符来引用同一个对象或函数.有三种链接:外部,内部和无.

2在构成整个程序的翻译单元和库的集合中,具有外部链接的特定标识符的每个声明表示相同的对象或功能.在一个翻译单元内,具有内部链接的标识符的每个声明表示相同的对象或功能.没有链接的标识符的每个声明表示唯一的实体.

3如果对象或函数的文件范围标识声明包含存储类指定静态,则标识符具有内部链接.

4对于在存储类规范外部声明的标识符,在该范围内可以看到该标识符的先前声明,如果先前声明指定内部或外部链接,则后面声明中标识符的链接与在先前声明中指定的联系.如果没有先前的声明可见,或者如果先前的声明没有指定链接,则标识符具有外部链接.

5如果函数的标识符声明没有存储类规范,则其链接的确定就像是使用存储类指定器extern声明的.如果对象的标识符声明具有文件范围且没有存储 - 特定的,它的联系是外在的.

看完之后看起来如果我声明一个变量就像说int a; 在2个源文件中.然后根据规则5和4都有外部链接,然后根据规则2,两者都应该引用同一个对象.那为什么编译器会产生问题.在标准中,暗示我们不能在2个源文件中声明这样,这应该抛出编译错误.首先,在标准中,它表示int a是一个定义,然后它表示2个定义实例是不可接受的.我知道我的经验是不允许的,但如果我能在标准中找到并密封我的理解,那对我来说非常有用.

请将以下标准的摘录与此规则相结合?或者我错过了胶水?:

声明规定了一组标识符的解释和属性.标识符的定义是对该标识符的声明: - 对于一个对象,导致为该对象保留存储; - 用于功能,包括功能体; - 对于枚举常量或typedef名称,是标识符的(唯一)声明.

正如5.1.1.1中所讨论的,预处理后的程序文本单元是一个翻译单元,它由一系列外部声明组成.这些被描述为"外部",因为它们出现在任何功能之外(因此具有文件范围).正如6.7中所讨论的那样,一个声明也会导致为一个对象或由标识符命名的函数保留存储,这是一个定义.

外部定义是外部声明,它也是函数(除了内联定义)或对象的定义.如果在表达式中使用了使用外部链接声明的标识符(除了作为sizeof运算符的操作数的一部分,其结果是整数常量),整个程序中的某个地方应该只有一个外部定义用于标识符; 否则,不得超过一个.

谢谢.

c standards iso compilation

22
推荐指数
1
解决办法
2645
查看次数

标签 统计

c ×4

compilation ×2

c++ ×1

c99 ×1

declaration ×1

fortran ×1

iso ×1

standards ×1

static-analysis ×1