c++用#define设置默认参数

C++ set default arguments with #define

本文关键字:默认 参数 设置 #define c++      更新时间:2023-10-16

可以设置默认参数为#defined值吗?

#define WIDTH 1920
#define HEIGHT 1080
void calculate(int width = WIDTH, int height = HEIGHT) {
    //do stuff
}

可以使用#define。但你应该这样做吗?

#define忽略作用域,并存在其他问题。这段代码可以正常工作,不会让任何人对不必要的定义感到恐惧。

enum {WIDTH  = 1920 };
enum {HEIGHT = 1080 };
void calculate(int width = WIDTH, int height = HEIGHT) 
{
  //do stuff
}

const int WIDTH  = 1920;
const int HEIGHT = 1080;
void calculate(int width = WIDTH, int height = HEIGHT) 
{
  //do stuff
}

这个也一样,虽然不是很清楚:

void calculate(int width = 1920, int height = 1080) 
{
  //do stuff
}

是的,你可以,但如果你可以避免,就不要这样做。假设在标题

中有这些定义
// foo.h
#define WIDTH 123

并且由于某些原因,您将此标头包含在其他标头中,其中包含以下内容:

// bar.h
#include "foo.h"
int bar(int WIDTH) { return WIDTH*2; }

根据我的经验,这可能会导致非常严重的错误,如果你不使用宏,这是完全可以避免的。

你可能会认为大写可以避免这样的错误,但是你仍然可以使用

// moo.h
#define WIDTH 321
#include "foo.h"

这甚至不会导致编译器错误,但更难跟踪错误。

是。WIDTH和HEIGHT宏将扩展到19201080。它的作用与:

void calculate(int width = 1920, int height = 1080) { // ...

根据您的情况,您可能出于不同的原因更喜欢static const int而不是宏,您可以在此答案中找到;或者至少将WIDTHHEIGHT重命名为更具体的名称,因为这似乎很容易发生冲突。正如另一个答案所述,使用静态变量的一个优点是它们是有作用域的。

c++ 17注意:你将能够内联一个变量。如果编译器在优化阶段没有/不能在const上做这件事,你可能会在将来更喜欢这种方法。