Tag: 声明

全局变量与局部变量的重新声明

当我编译下面的代码时 #include int main() { int a; int a = 10; printf(“a is %d \n”,a); return 0; } 我收到一个错误: test3.c: In function ‘main’: test3.c:6:5: error: redeclaration of ‘a’ with no linkage test3.c:5:5: note: previous declaration of ‘a’ was here 但是,如果我将变量设为全局,那么它可以正常工作。 #include int a; int a = 10; int main() { printf(“a is %d \n”,a); return […]

C中的声明或定义

来自外部变量Wiki : 如果extern关键字和初始化值都不存在,则该语句可以是声明或定义。 由编译器来分析程序的模块并做出决定。 我无法完全理解关于C的这个陈述的含义。例如,它是否意味着: int i; 不一定是声明(正如我直到现在所假设的那样),但也可以是一个定义(根据同一网页上的定义和声明的定义,没有双关语)? 简而言之,就是上面的陈述:a。 只是声明,或b。 声明+定义? 参考: 变量声明和定义 收到的答复摘要: Declaration Definition Tentative Definition Initialized int i; (inside a block) Yes Yes No No int i=5; (inside a block) Yes Yes No Yes(to 5) int i; (otherwise) Yes No Yes Yes(to 0) extern int i; Yes No No No All definitions […]

undefined C struct forward声明

我有一个头文件port.h,port.c和我的main.c 我收到以下错误:’ports’使用未定义的struct’port_t’ 我以为我已经在我的.h文件中声明了结构,并且.c文件中的实际结构是可以的。 我需要有前向声明,因为我想在port.c文件中隐藏一些数据。 在我的port.h中,我有以下内容: /* port.h */ struct port_t; port.c: /* port.c */ #include “port.h” struct port_t { unsigned int port_id; char name; }; main.c中: /* main.c */ #include #include “port.h” int main(void) { struct port_t ports; return 0; } 非常感谢任何建议,

联盟可以在声明中初始化吗?

例如,假设我们有一个联盟 typedef union { unsigned long U32; float f; }U_U32_F; 当声明了这个union类型的变量时,有没有办法设置初始值? U_U32_F u = 0xffffffff; // Does not work…is there a correct syntax for this?

函数内部是否有函数声明?

我们可以在函数内部声明函数(我想要一个局部变量,但它作为函数声明解析): struct bvalue; struct bdict { bdict(bvalue); } struct bvalue { explict operator bdict() const; } struct metainfo { metainfo(bdict); } void foo(bvalue v) { metainfo mi(bdict(v)); // parses as function declaration metainfo mi = bdict(v); // workaround // (this workaround doesn’t work in the presence of explicit ctors) } 唯一的原因是“因为它使解析器变得更简单”和“因为标准是这样说的”,还是有一个不明确的用途?

复杂的声明

我如何解释复杂的声明,如: int * (* (*fp1) (int) ) [10]; —> declaration 1 int *( *( *[5])())(); ——–> declaration 2 是否有任何规则应该遵循以理解上述声明?

switch语句中的变量定义

在下面的代码中,为什么变量i没有赋值1 ? #include int main(void) { int val = 0; switch (val) { int i = 1; //i is defined here case 0: printf(“value: %d\n”, i); break; default: printf(“value: %d\n”, i); break; } return 0; } 当我编译时,我得到一个警告, i尽管int i = 1; i仍未被初始化int i = 1; 这清楚地初始化了它 $ gcc -Wall test.c warning: ‘i’ is used uninitialized […]

C函数指针语法

我的问题非常简单。 通常,在声明某个变量时,将其类型放在它之前,如: int a; 函数指针的类型可能是:int(*)(int,int),以防我们指向一个带两个int的函数并返回一个int。 但是,在声明这样的指针时,其标识符不在类型之后,如: int(*)(int,int) mypointer; 相反,你必须在中间写入标识符: int(*mypointer)(int,int); 为什么会这样? 对不起,我知道这是一个非常简单的问题…… 感谢大家的回复。 如

为什么需要前瞻性声明?

可能重复: C ++应该消除头文件吗? 在像C#和Java这样的语言中,没有必要在使用它之前声明(例如)一个类。 如果我理解正确,这是因为编译器对代码进行了两次传递。 在第一个中它只是“收集可用信息”,在第二个中它检查代码是否正确。 在C和C ++中,编译器只进行一次传递,因此当时所有东西都需要可用。 所以我的问题基本上就是为什么不用C和C ++这样做。 它不会消除头文件的需求吗?