在C和c++中声明和排列代码的习惯
declaration in C and C++ and the habit of arranging code
我不知道这是什么问题,请花时间阅读。它涉及到C和c++的区别,以及编写代码的习惯;代码如下:我把它分成3个文件;c
#include"myh.h"
unit_t *paa;
int main()
{
paa=(unit_t*)malloc(sizeof(unit_t));
if(paa==NULL){
printf("out of memoryn");
exit(1);
}
fuzhi(paa);
printf("hello !%d",paa->number);
free(paa->msg);
free(paa);
paa=NULL;
return 0;
}
另一个c: key .c
#include"myh.h"
void fuzhi(unit_t* pa)
{
pa->number=3;
pa->msg=(char *)malloc(20);
printf("fuzhi !");
}
文件myh.h
#ifndef P_H
#define P_H
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct{
int number;
char *msg;
}unit_t;
void fuzhi(unit_t* pa);
int a;
#endif
所以问题是当我使用C运行代码时,它没有问题,但是当我将其保存为cpp时,错误是'a'的多重定义;为什么?第二个问题是我不知道我安排代码的习惯是好是坏。有人给我一些好建议吗?当代码很大时,我通常将声明放在h文件中,并使用c/cpp来编写函数的定义。然后使用main c/cpp实现main功能。有人可以给我一些关于写代码的好建议,我是一个新的学习者。谢谢。
您必须记住的第一件事是C和c++是不同的语言,因此对于全局声明的变量有不同的规则。可以多次定义全局变量a
:一次在main.c
文件中,一次在ke.c
文件中。
这是因为在头文件中定义了变量,该变量包含在两个源文件中。你应该做的是在头文件中声明变量,然后在单个源文件中定义。
例如,在头文件中应该有
extern int a;
在一个源文件中:
int a;
编译过程如下:
对于每个c.或。cpp文件(称为编译器):
- 预处理文件,解析所有宏,#includes等…
- 编译该文件,生成目标文件.o。目标文件包含机器码,但非局部变量仍然通过名称引用。
最后链接所有目标文件,包括:
- 解析所有非本地变量名
- 用地址 代替
在您的示例中,您有两个编译器:main.c和key .c。
在预处理期间,两者都包含.h文件。因此,两个编译器都声明了一个全局变量int a
。每个编译器都使用该全局变量的副本。
然后,链接器尝试解析这些名称,并惊讶地看到两个对象文件定义了两个同名的变量。
要解决它,在c++头文件中使用关键字"extern":
extern int a;
这表明将有一个全局变量a
,但它没有定义它(类似于没有定义的函数声明)。在其中一个编译器中,您需要重复正常的int a
定义,但是在其他编译器看不到的地方(即- 而不是头文件中的)
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 为什么不;名字在地图上是按顺序排列的吗
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 添加气泡排序代码以排列列表
- 为什么这段代码没有生成所有的排列?
- 重新排列代码行时未引发错误"Double free or corruption"
- C++编码代码 青蛙河一号在大型排列测试中失败
- 在不同的标头中排列与模板相关的代码
- LLVM clang编译器优化器以一种非常奇怪的方式重新排列代码,该怎么做
- 关于歧义排列的代码问题
- 在C和c++中声明和排列代码的习惯