gpt4 book ai didi

c++ - 项目 : C vs C++ 中包含多个相同的头文件

转载 作者:太空宇宙 更新时间:2023-11-03 10:22:28 25 4
gpt4 key购买 nike

这里我有一个示例工程,有两个源文件和一个头文件,如下:

主.c:

#include<stdio.h>                                                               
#include "personal.h"
int main(){
i = 5;
printf("Value is %d\n",i);
return 0;
}

子.c:

#include "personal.h"                                                           
// do nothing

最后是 personal.h:

#pragma once                                                                    
int i;

每个 .c 文件都包含 personal.h,它是“ protected ”。我用 gcc 编译,一切正常:

>gcc sub.c main.c -o out
>./out
Value is 5

但是对于 g++,会发生这种情况:

>g++ sub.c main.c -o out
/tmp/cctYwVnO.o:(.bss+0x0): multiple definition of `i'
/tmp/ccPElZ27.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status

在文件链接方式、预处理器事件等方面,C++ 和 C 之间有什么根本不同吗?我对 clang 等其他编译器进行了同样的尝试,同样的事情发生了。我可能在这里遗漏了一些愚蠢的东西。

最佳答案

在 C 中,

int i;

是一个暂定的定义。通过包含,您可以在两个编译单元中对 i 进行初步定义。 C 标准允许在多个编译单元中有暂定定义,但不强制实现接受它。 Unix C 编译器的自定义行为是允许它,但 gcc 有一个选项 (-fno-common) 来防止它并在链接时生成错误(这样你就可以检查编译器的代码,正如我认为微软的那样,它不允许它或允许更好的代码的平台——我不知道没有,但这是 GCC 文档给出的基本原理)。

IIRC,C++ 没有这样的津贴。

请注意,您可能需要声明而不是标题中的定义。因此对于上面的 i 应该是

extern int i;

在标题和一个

int i;

一个 .c 文件中的全局范围内。

关于c++ - 项目 : C vs C++ 中包含多个相同的头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58609940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com