在C和c++中声明和排列代码的习惯

declaration in C and C++ and the habit of arranging code

本文关键字:代码 排列 习惯 c++ 声明      更新时间:2023-10-16

我不知道这是什么问题,请花时间阅读。它涉及到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定义,但是在其他编译器看不到的地方(即- 而不是头文件中的)