前言

众所周知,#pragma once语句是防止头文件重复包含非常常用的一条语句
VS编译器在创建.h文件的时候会自动帮你在开头添加这个语句
但是在gcc编译器下,这个语句就可能会出现一些问题

所使用编译器:

  • VS2019(windows10)
  • 树莓派(linux-gcc)

warning: #pragma once in main file

在我尝试在linux环境下使用#pragma once语句时,遇到了这个报错

image-20220310214852830

解决这个问题的办法很简单,就是不要编译头文件

编译器会自动展开头文件,无需手动编译

image-20220310215136660

image-20220310215008979

出现问题原因

网上查了查:出现这个问题的原因是编译器在编译头文件的时候,#pragma once本身是没有含义的语句,所以报错了。

  • 也有人说是因为linux不支持这个语句,我们来试试

右侧代码中包含了两个test.h的引用,在预处理中只包含了一次

image-20220310215650055

去掉头文件中的#pragma once,再次编译,可以看到预处理文件中出现了两次头文件的内容

这说明linux-gcc编译器是支持该语句的,并非网上说的不支持!

其他解决方法

如果你的gcc编译器不管咋弄都有这个报错,咱可以不用它嘛!
使用条件编译指令ifndef也可以达成防止头文件重复包含的效果

1
2
3
4
5
6
#ifndef __TEST_H__//如果没有定义过这个符号
#define __TEST_H__//定义该符号

//头文件内容

#endif

查资料查到外网去了~

刚刚写预处理博客的时候,查有关这个问题的资料,百度都给我推了外网的论坛

参考:https://bbs.csdn.net/topics/395771733?page=1


网上有关这个报错的信息的确不多,特此写篇博客记录一下

如果对你有帮助,还请点个👍,万分感谢!