头文件保护为什么报warring?

用c++写了一份尾插法单向链表,设计了Node.h和LinkList.h,两个类头文件,和LinkList.cpp和main.cpp源程序。在Node.h和LinkList.h中使用了#ifndef、#define、#endif头文件保护,项目编译运行成功,但是报错:
image.png

//Node.h
#ifndef NODE.H 
#define NODE.H 
#include <iostream>
using namespace std;
//单项链表节点对象 
class Node{
        
    public:
        int data;
        Node *next;
};

#endif
//LinkList.h
#ifndef LINKLIST.H
#define LINKLIST.H 
#include<iostream>
#include"Node.h"
using namespace std;
//单项尾插法链表 

class LinkList{
    public:
        LinkList(){
            head = new Node(); 
            head->next = NULL; 
            head->data=0;
            end = head;
        } 
        Node *head;  //头节点 
        Node *end;  //尾节点
        
        void create(int value);
        int receive(int nob);
        bool find(int value);
};

#endif

//LinkList.cpp
#include<iostream>
#include "Node.h"
#include "LinkList.h"
using namespace std;

void LinkList::create(int value){
        Node *node = new Node();
        node->data = value;
        node->next = NULL;
        this->end->next = node;
        this->end = node;
        this->head->data++;
}

int LinkList::receive(int nob){
    Node *p = this->head;
    
    for(int j = 0;j<=nob;j++){
        p = p->next;
    }
    
    return p->data;
}

bool LinkList::find(int value){ 
    if(this->head->data==0) return false; 
    Node *p = this->head->next;
    
    while(p!=NULL){
        if(p->data==value){
            return true;
        }    
        p = p->next;
    }
    
    return false;
}

//main.cpp
#include <iostream>
#include"Node.h"
#include"LinkList.h"

using namespace std; 

int main(int argc, char** argv) {
    
    LinkList temp;
    temp.create(96);
    temp.create(52);
    cout<<temp.find(52)<<endl;
    return 0;
}

报错信息:

1    13    C:\Users\y\Desktop\cpp\Node.h    [Warning] extra tokens at end of #ifndef directive
2    13    C:\Users\y\Desktop\cpp\Node.h    [Warning] missing whitespace after the macro name

询问了文心一言,说宏定义没有空格的原因,然而头文件保护没有跟着的数据,何来空格。

阅读 120
avatarAI BotBETA

回答

问题出在你的宏定义名称中包含了点号(.),这在 C++ 中通常不是宏定义名称的推荐做法。宏定义名称通常使用全大写字母和下划线(_)组成,以避免与变量名、函数名等混淆,同时也避免编译器处理时的潜在问题。

在你的代码中,#ifndef NODE.H#define NODE.H 以及 #ifndef LINKLIST.H#define LINKLIST.H 应该改为:

// Node.h
#ifndef NODE_H
#define NODE_H
#include <iostream>
using namespace std;

class Node {
public:
    int data;
    Node *next;
};

#endif

// LinkList.h
#ifndef LINKLIST_H
#define LINKLIST_H
#include <iostream>
#include "Node.h"
using namespace std;

class LinkList {
public:
    LinkList() {
        head = new Node();
        head->next = NULL;
        head->data = 0;
        end = head;
    }
    Node *head;  // 头节点
    Node *end;   // 尾节点

    void create(int value);
    int receive(int nob);
    bool find(int value);
};

#endif

使用 NODE_HLINKLIST_H 作为宏定义名称,可以避免由于点号(.)在宏定义中可能引起的解析问题。这通常是编译器在预处理阶段处理宏定义时的一个敏感点。

更改后,重新编译你的项目,警告应该会消失。

1 个回答

最初查看,你应该修改宏名,只是用大写字母和下划线:

#ifndef NODE_H 
#define NODE_H 

#ifndef LINKLIST_H
#define LINKLIST_H 

你还可以使用这样保护整个文件:

#pragma once

另外,我没有理解你的头文件保护没有跟着的数据是什么意思,可以解释下你的意思吗

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏