gpt4 book ai didi

c++ - 在 C++ 头文件/实现文件中放置#undef 指令的正确方法

转载 作者:太空宇宙 更新时间:2023-11-04 15:35:57 29 4
gpt4 key购买 nike

我正在编写一个类(在头文件 myClass.h 和实现文件 myClass.cpp 中分开),我想将其与标准 C++ 和 Qt 框架一起使用.由于代码中的差异非常小(我想尝试一次),我决定 #define USINGQT 1 以便通过

切换小部分代码
#if USINGQT==1
//Qt code
#else
//standard code
#endif

现在我得出结论,在“激活”USINGQT 开关。但是,上述方法会使代码变得非常困惑。我的解决方案(在头文件中):

#if USINGQT==1
#include <QString>
#define string QString
#else
#include <string>
#define string std::string
#endif

现在回答问题:

考虑文件看起来像

---myclass.h-------------------------
#ifndef MYCLASS_H
#define MYCLASS_H

#define USINGQT 1 //1=on, else off
#if USINGQT==1
#include <QString>
#define string QString
#else
#include <string>
#define string std::string
#endif

namespace mySpace {

class MyClass {
string qtOrStd;
string foo();
//etc...
};

} //namespace
#endif //MYCLASS_H
-------------------------------------

---myclass.cpp-----------------------
#include "myclass.h"
using namespace mySpace;

//implementations
string MyClass::foo() //string symbol occurs, as does the USINGQT
-------------------------------------
  1. #undef stringUSINGQT 符号的正确位置在哪里?在头文件的末尾(这将需要在实现文件中重新定义和“取消定义”)还是仅在实现文件的末尾?

  2. 我也应该将 string 宏大写,难道我不应该...? >.>

  3. 如果我将宏定义放在 inside 命名空间中,我将收到大约。 800 条错误消息,其中包含“no member of mySpace::std”等条目。你能在没有进一步信息的情况下谈谈吗?否则它编译得很好。


编辑:我可能应该告诉你,我希望宏仅适用于这个特定的头文件及其实现文件。尽管事实上我当然会选择 typedef - 在宏情况下,我猜,我应该将 #undef 放在实现的末尾文件。因为包含保护,宏不会被重新定义。

最佳答案

  1. 首先,您不需要通过使 USINGQT 等于 1 来切换它,您可以简单地 #define USINGQT 然后使用 #ifdef USINGQT用于您的 if 语句。
  2. 就您切换使用哪个字符串库的能力而言,我建议您使用 typedef 和预处理器 if 语句。这将避免任何命名空间问题。下面显示了一个示例。

//------------ 一些配置文件 ------------=

#define USINGQT

// -------------- MyClass.h --------------------=
// Header guard
#ifndef MyClass
#define MyClass

// Conditional Header types
#ifdef USINGQT
// QT OPTION
typedef QString my_string;

#else
// Not QT
typedef std::string my_string;
#endif

class MyClass {
public:
my_string some_string;

MyClass()
{
my_string = "hello world";
}
};
#endif

关于c++ - 在 C++ 头文件/实现文件中放置#undef 指令的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33826628/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com