首页 > 解决方案 > 项目中同一头文件的多个包含:C vs C++

问题描述

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

主.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,它是“受保护的”。我用 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++ccompilationincludepreprocessor

解决方案


在 C 中,

int i;

是一个暂定的定义。借助包含,您可以i在两个编译单元中获得暂定定义。C 标准允许在多个编译单元中具有暂定定义,但不强制实现接受这一点。-fno-commonUnix C 编译器的自定义行为是允许它,但 gcc 有一个选项(或者对于允许更好代码的平台——我不知道,但这是 GCC 文档给出的基本原理)。

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

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

extern int i;

在标题和一个

int i;

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


推荐阅读