我读过#pragma once使用#pragma once时会有一些编译器优化,这会导致编译速度更快。 我认识到这是非标准的,因此可能会造成跨平台兼容性问题。 这是非Windows平台上的大多数现代编译器(gcc)所支持的吗? 我想避免平台编译问题,也想避免后备卫士的额外工作: #pragma once #ifndef HEADER_H #define HEADER_H … #endif // HEADER_H 我应该担心吗? 我应该在这方面花费更多精力吗?
我有这样的C ++文件 #ifndef _MOVE_H #define _MOVE_H class Move { int x, y; public: Move(int initX = 0, int initY = 0) : x(initX), y(initY) {} int getX() { return x; } void setX(int newX) { x = newX; } int getY() { return y; } void setY(int newY) { y = newY; } }; #endif […]
关于包括卫兵的两个常见问题: 第一个问题: 为什么不包括保护我的头文件不被相互recursion包含的保护 ? 我不断地收到有关显然存在的不存在的符号的错误,甚至每次我写下类似下面的语句错误, “啊” #ifndef A_H #define A_H #include "bh" … #endif // A_H “BH” #ifndef B_H #define B_H #include "ah" … #endif // B_H “的main.cpp” #include "ah" int main() { … } 为什么我会收到错误编译“main.cpp”? 我需要做些什么来解决我的问题? 第二个问题: 为什么不包括防止多重定义的守卫? 例如,当我的项目包含两个包含相同头文件的文件时,有时候连接器会抱怨多次定义了一些符号。 例如: “header.h” #ifndef HEADER_H #define HEADER_H int f() { return 0; } #endif // HEADER_H […]
解决了 真正帮助我的是,我可以在.cpp文件中包含头文件,而不会导致重新定义的错误。 我是C ++新手,但是我在C#和Java中有一些编程经验,所以我可能会错过C ++特有的基本东西。 问题是我真的不知道什么是错的,我会粘贴一些代码来解释这个问题。 我有三个类,GameEvents,Physics和GameObject。 我有他们每个人的标题。 GameEvents有一个Physics和一个GameObjects列表。 物理学有一个GameObjects列表。 我想要实现的是我希望GameObject能够访问或拥有一个物理对象。 如果我简单地在GameObject中包含“Physics.h”,我就会得到“错误C2111:'ClassXXX':'class'type redifinition”,据我所知。 而这正是我认为#include-guard会帮助我,所以我在我的Physics.h中加入了一个包含后卫,因为这是我想包含两次的头文件。 这是它的样子 #ifndef PHYSICS_H #define PHYSICS_H #include "GameObject.h" #include <list> class Physics { private: double gravity; list<GameObject*> objects; list<GameObject*>::iterator i; public: Physics(void); void ApplyPhysics(GameObject*); void UpdatePhysics(int); bool RectangleIntersect(SDL_Rect, SDL_Rect); Vector2X CheckCollisions(Vector2X, GameObject*); }; #endif // PHYSICS_H 但是,如果我在我的GameObject.h中包含“Physics.h”,现在是这样的: #include "Texture2D.h" #include "Vector2X.h" #include […]