使用const,enum,inline template<>替代#define

40 篇文章 3 订阅
19 篇文章 1 订阅

#define 等预处理器命令并不被视为语言的一部分。#define定义的常亮或许从来都没有进入到编译器,或许编译器没有使用#define的名称而只使用了其值。因此,当该define出现错误时,编译器给出的提示中如果写的是定义的值而不是名称,则难以被追踪(当这个宏不是你定义的时候,看到这个错误中的值甚至不知道这是宏定义还是变量的值还是返回值)。

  1. 使用’指向常量的常量指针’来替代宏定义的字符串
#define MBP MacBookPro
//替代:
const char* const mbp = "MacBookPro";
  1. 使用std::string来替代宏定义的字符串
const std::string rs7("Audi RS7");  //用于替代#define
  1. 如果老式编译器不允许在类内赋默认初值,而在类编译期间需要使用这个值,可以使用enum来定义常量
class Foo
{
public:
    ........
    enum { x = 10};
}

==使用enum{something = x}来替代#define是很好的解决办法。==

  1. 务必对所有的宏中的每一个实参都加上小括号;务必禁止在使用宏函数的时候传入带有’++’、’–’运算符的参数

使用模板template inline函数来替代宏函数

#define CALL_WITH_MAX(a,b)  \
    f( (a) > (b) ? (a) : (b)  )

替代:

template<typename T>
inline void callWithMax(const T& a,const T& b)
{
    /*得到a、b的大值,以之调用f*/
    f( a > b ? a : b);      //f是一个函数
}

要点:
1. 使用inline来模仿#define宏函数,inline与宏函数一样不存在函数调用时的额外开销。
2. 使用const T&来接收参数,而不使用T和T&。(pass-by-reference-to-const)

总结

使用以上几种方法来替代宏定义,但是,宏定义并非可以完全不使用,#define尽量少用。

  1. 对于单纯的常量,使用const对象或enum替代。

  2. 对于宏函数(macros),尽量使用template inline函数来替代。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是手动实现这些头文件里所有的STL容器的代码: ``` // iostream namespace mystd { class ostream { public: ostream& operator<<(const char* str) { // 实现输出字符串的逻辑 return *this; } // 其他重载运算符和成员函数 }; static ostream cout; } // memory namespace mystd { template<typename T> class allocator { public: using value_type = T; // 实现分配和释放内存的函数 }; } // stack namespace mystd { template<typename T, typename Container = mystd::vector<T>> class stack { public: using value_type = T; using container_type = Container; // 实现栈的各种函数 }; } // fstream namespace mystd { class filebuf { public: // 实现文件缓冲区相关函数 }; class ifstream { public: ifstream(const char* filename) { // 实现打开文件的逻辑 } // 实现读取文件的逻辑 }; class ofstream { public: ofstream(const char* filename) { // 实现打开文件的逻辑 } // 实现写入文件的逻辑 }; } // vector namespace mystd { template<typename T, typename Allocator = mystd::allocator<T>> class vector { public: using value_type = T; using allocator_type = Allocator; // 实现vector的各种函数 }; } // cmath namespace mystd { double pow(double base, double exponent) { // 实现求幂函数 } // 其他数学函数的实现 } // iomanip namespace mystd { class setprecision { public: setprecision(int n) { // 实现设置输出精度的逻辑 } // 其他重载运算符和成员函数 }; } // exception namespace mystd { class exception { public: virtual const char* what() const noexcept { return "Unknown exception"; } }; } // climits namespace mystd { constexpr int INT_MAX = 2147483647; // 其他常量的定义 } // array namespace mystd { template<typename T, std::size_t N> class array { public: using value_type = T; // 实现数组的各种函数 }; } // cstdint namespace mystd { using int8_t = signed char; using int16_t = short int; using int32_t = int; using int64_t = long long int; // 其他数据类型的定义 } // string namespace mystd { class string { public: // 实现字符串的各种函数 }; } ``` 以上代码只是简单实现了各个STL容器的基本功能,具体实现方式和函数可能会有所不同,仅供参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值