user-0 提问: 使用#pragma once出现#pragma once in main file这个错误 （有图） 求具体解决方案

回复:
user: user-1
content: 引用 8 楼 何方月 的回复:我遇到了同样的问题，虽然代码可以运行，但是看着这个警告就很难受，有没有大佬说下这个warning是咋回事，怎么解决下 这个和你用的编译器也有关系，比如我用Devcpp就有这个警告，用VS2019就没有

user: user-2
content: 我遇到了同样的问题，虽然代码可以运行，但是看着这个警告就很难受，有没有大佬说下这个warning是咋回事，怎么解决下

user: user-2
content: #pragma once和#if……是不需要同时使用的，前者可以单独起作用

user: user-3
content: 不要重复导入头文件

user: user-0
content: 不是这些原因

user: user-4
content: 看到 Output Filename 就能明白了，你在试图直接编译头文件，于是 #pragma once 明显是没有意义的(就像在源文件里写 #pragma once 一样)，于是编译器提出警告。

user: user-0
content: 这样吧 我重换个例子 刚刚那个例子要包含头文件  把方法一和方法二的头文件命名为SeqList.h 方法（一）：加#pragma once不行（去掉stdio.h无意义，当然也不行） #pragma once  #include<stdio.h>  #define MaxSize 100  typedef char DataType;  typedef struct { 	DataType list[MaxSize]; 	int size; }SeqList;  void ListInitiate(SeqList *L) { 	L->size = 0; }  int ListLength(SeqList L) { 	return L.size; }  int ListInsert(SeqList *L,int i, DataType x) { 	int j; 	if(L->size>=MaxSize) 	{ 		printf("数组已满无法插入!\n"); 		return 0; 	} 	else if(i<0||i>L->size) 	{ 		printf("参数i不合法！\n"); 		return 0; 	} 	else 	{ 		for(j=L->size;j>i;j--) 		L->list[j]=L->list[j-1]; 		L->list[i]=x; 		L->size++; 		return 1; 	} }  int ListDelete(SeqList *L,int i,DataType *x) { 	int j; 	if(L->size<=0) 	{ 		printf("顺序表已空无数据可删!\n"); 		return 0; 	} 	else if(i<0||i>L->size-1) 	{ 		printf("参数i不合法"); 		return 0; 	} 	else 	{ 		*x=L->list[i]; 		for(j=i+1;j<=L->size-1;j++)L->list[j-1]=L->list[j]; 		L->size--; 		return 1; 	} 	 }  int ListGet(SeqList L,int i,DataType *x) { 	if(i<0||i>L.size-1) 	{ 		printf("参数i不合法！\n"); 		return 0; 	} 	else 	{ 		*x=L.list[i]; 		return 1; 	} }  方法（二）： #ifndef SeqList_H #define SeqList_H  #include<stdio.h>  #define MaxSize 100  typedef char DataType;  typedef struct { 	DataType list[MaxSize]; 	int size; }SeqList;  void ListInitiate(SeqList *L) { 	L->size = 0; }  int ListLength(SeqList L) { 	return L.size; }  int ListInsert(SeqList *L,int i, DataType x) { 	int j; 	if(L->size>=MaxSize) 	{ 		printf("数组已满无法插入!\n"); 		return 0; 	} 	else if(i<0||i>L->size) 	{ 		printf("参数i不合法！\n"); 		return 0; 	} 	else 	{ 		for(j=L->size;j>i;j--) 		L->list[j]=L->list[j-1]; 		L->list[i]=x; 		L->size++; 		return 1; 	} }  int ListDelete(SeqList *L,int i,DataType *x) { 	int j; 	if(L->size<=0) 	{ 		printf("顺序表已空无数据可删!\n"); 		return 0; 	} 	else if(i<0||i>L->size-1) 	{ 		printf("参数i不合法"); 		return 0; 	} 	else 	{ 		*x=L->list[i]; 		for(j=i+1;j<=L->size-1;j++)L->list[j-1]=L->list[j]; 		L->size--; 		return 1; 	} 	 }  int ListGet(SeqList L,int i,DataType *x) { 	if(i<0||i>L.size-1) 	{ 		printf("参数i不合法！\n"); 		return 0; 	} 	else 	{ 		*x=L.list[i]; 		return 1; 	} }  #endif  却是可以的。 那为什么第一种方法防包含不行呢？为什么加#pragma once不行？

user: user-0
content: 防包含两种方法 方法（一）：加#pragma once不行（去掉stdio.h无意义，当然也不行） #pragma once  #include<stdio.h> #include"AdjMGraph.h"  typedef struct { 	int row; 	int col; 	int weight; }RowColWeight;  void CreatGraph(AdjMGraph *G,DataType V[],int n,RowColWeight E[],int e) { 	int i,k; 	Initiate(G,n); 	for(i=0;i<n;i++) 		InsertVertex(G,V[i]); 		 	for(k=0;k<e;k++) 		InsertEdge(G,E[k].row,E[k].col,E[k].weight); }  方法（二）： #ifndef AdjMGraphCreate_H #define AdjMGraphCreate_H  #include<stdio.h> #include"AdjMGraph.h"  typedef struct { 	int row; 	int col; 	int weight; }RowColWeight;  void CreatGraph(AdjMGraph *G,DataType V[],int n,RowColWeight E[],int e) { 	int i,k; 	Initiate(G,n); 	for(i=0;i<n;i++) 		InsertVertex(G,V[i]); 		 	for(k=0;k<e;k++) 		InsertEdge(G,E[k].row,E[k].col,E[k].weight); }  #endif  确是可以的。 那为什么第一种方法防包含不行呢？为什么加#pragma once不行？

user: user-2
content: 当前文件被源文件引用后应当是不需要导入stdio.h的，当然导入后是否会引起这个错误不清楚  另外.h文件容易出一些神奇的问题，如果实在不行，可以重建为.hpp文件试试