Tag: 定义

是否需要在头文件中声明所有C函数

我是否需要在头文件中声明我在.c文件中使用的所有函数,或者我可以直接在.c文件中声明和定义? 如果是这样,在这种情况下.c文件中的定义是否也算作声明?

为什么结构定义有内部联系?

(我在谈论C,但它也适用于C ++中的类模板) 在头文件中,放置所有DECLARATIONS而不是定义是自定义的。 但是,我们通常将结构定义或类模板放在头文件中,而实际上并不知道为什么我们可以。 这并没有多大意义,因为它们也是定义 – 一个定义规则。 (是的,结构定义和类模板不会导致设置任何存储,但是仍然会出现“重新定义”错误,这意味着它们是定义)。 EX)在同一文件中定义具有相同标记的多个结构会给出重新定义错误,但在多个源文件中定义具有相同标记的多个结构不会导致任何错误(类同样发生)。 唯一有意义的是结构定义和类模板具有内部链接(与默认外部链接相对),但我在K&R或参考手册中找不到任何关于它的引用。 实际上,连接中甚至没有提到结构。 我想知道ANSI标准指出这种现象的确切参考。 (国际海事组织,这是一个非常模棱两可的问题,在ANSI标准的某处提到)。 编辑我不是问为什么结构定义可以放入头文件。 我问为什么在头文件中放置结构定义不会像我们在头文件中放入变量定义时那样导致重定义错误(并将其包含在多个源文件中) EX)test1.c:int a = 3; test2.c:int a = 4; 由于重新定义导致编译错误。 然而, test1.c:struct test {int a}; test2.c:struct test {int b}; 不会导致编译错误,我能想出的唯一原因是结构定义要么具有内部链接,要么根本没有链接。

C定义中的运算符优先级

维基百科声称[]运算符在评估中位于*运算符之前。 那么,为什么以下声明: char *a[3]; 声明一个由3个字符指针组成的数组,而不是根据运算符优先级指向3个字符数组的指针?

变量重定义,嵌入式c

我正在研究一个嵌入式c项目,并且遇到了全局变量重定义的问题。 我已将函数声明和定义拆分为少量的.h和.c文件。 其中许多函数需要访问global_vars.h中定义的全局变量。 因此,在头文件的开头,#ifndef,#define部分,“global_vars.h”。 如果我不这样做,你可能会想到我得到了一堆未定义的变量错误。 但是,即使global_vars.h具有#ifndef _GLOBAL_VARS_H_ #define … #endif,我也会得到所有全局变量的重定义错误。 我的猜测是,当链接器尝试链接各种目标文件时,由于所有“blah_blah.h”文件中的#include“global_vars.h”,它会看到重新定义。 不过,我的理解是#ifndef …处理这个问题。 我有什么东西可以俯瞰吗? 提前致谢

链接问题与“多重定义”编译错误

我有以下“常量”标题: /* constants.h */ #ifdef __cplusplus extern “C” { #endif #pragma once #ifndef CONSTANTS_H #define CONSTANTS_H const char * kFoo = “foo”; const char * kBar = “bar”; #endif #ifdef __cplusplus } #endif 我在文件Xc和Yc #include -ing这个标题。 请注意,我不是在Xh或Yh包含它。 文件Xc和Yc被编译成目标文件,这些目标文件存档到名为libXY.a的静态库中。 当我在Zh包含Xh和Yh时,当我链接到libXY.a ,我无法编译Zc而没有错误: /* Zh */ #include “Xh” #include “Yh” 尝试编译Zc时出现以下编译错误: /path/to/libXY.a(Xo):(.data+0x0): multiple definition of `kFoo` /path/to/libXY.a(Yo):(.data+0x0): first […]

重新申报错误

我已经理解了声明和定义之间的区别当我遇到疑问时,我正在练习一些问题,下面的代码要求我列出代码片段中的错误。 f(int a,int b) { int a; a=20; return a; } 为什么这会给出重新声明错误? 它不应该给出a的多重定义,因为: f(int a,int b) – 这里定义了吗? 在函数体中, int a被定义了吗? 那么为什么不是多重定义错误?

C中暂定定义背后的基本原理是什么?

考虑以下程序。 这会给出任何编译错误吗? #include int s=5; int s; int main(void) { printf(“%d”,s); } 乍一看似乎编译器会给出变量重定义错误,但程序根据C标准完全有效。 (请参阅http://ideone.com/Xyo5SY上的现场演示)。 暂定定义是没有存储类说明符且没有初始化程序的任何外部数据声明。 C99 6.9.2 / 2 对于具有文件范围而没有初始化程序且没有存储类指定程序或存储类指定静态的对象的标识声明构成了一个暂定的定义。 如果翻译单元包含一个或多个用于标识符的暂定定义,并且翻译单元不包含该标识符的外部定义,则该行为就像翻译单元包含该标识符的文件范围声明一样,其复合类型为翻译单元的结尾,初始化程序等于0。 我的问题是,允许暂定定义的理由是什么? 在C中有没有用过这个? 为什么C允许暂定?

为什么允许结构具有“指向其自身类型的指针”作为成员但不允许“(结构类型的数组)”本身?

当我尝试声明以下function时 typedef struct TRIE_NODE { char* word; struct TRIE_NODE node[26]; }TRIE_NODE; 我收到以下错误: ‘struct TRIE_NODE’的定义在结束’}’之前是不完整的 但是,如果我使用指向26个节点的指针声明此函数,它编译就好了。 typedef struct TRIE_NODE { char* word; struct TRIE_NODE* node[26]; }TRIE_NODE; 我想,因为这不是一个实例,所以我不可能得到指向这26个数组中第一个的指针,但如果这就是问题,那么TRIE_NODE* node[26]怎么也不是问题呢? 这个声明不等同于TRIE_NODE node[1][26]吗?

C中的循环定义

我写的是: typedef enum _MyStatus { MY_STATUS_OK = 0, MY_STATUS_GENERAL_ERROR = -1, } MyStatus; typedef MyStatus (*MyCallback)(MySettings *settings); typedef struct _MySettings { MyCallback callback; } MySettings 但是,它不会像定义MyCallback时那样编译它不知道MySettings。 如果我交换MySettings和MyCallback,那将是另一回事:MySettings不会知道MyCallback。 在C中处理这类问题有多普遍? 谢谢!

变量声明和定义

int x; 这是宣言还是定义? 当我写下面的代码时, #include int main(void) { int x; printf(“%p”,&x); return 0; } 它打印一些地址。 因此,在分配内存时, int x; 不能只是一个宣言。 这是一个定义吗?