C ++使用#define设置默认参数

时间:2016-09-20 17:56:41

标签: c++ default-arguments

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

{{1}}

3 个答案:

答案 0 :(得分:1)

可以使用#define。但是你呢?

#define忽略范围,并且other problems。这段代码也可以正常工作,不会让任何人对不必要的定义感到恐惧。

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
}

答案 1 :(得分:0)

是。 WIDTH和HEIGHT宏只会扩展为19201080。这将与:

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

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

C ++ 17注意:您将能够to inline a variable。如果编译器在优化阶段没有/不能执行此操作,那么您将来可能更喜欢这种方法。

答案 2 :(得分:0)

是的,你可以,但如果你能避免它,就不要这样做。想象一下,你有一个标题中的定义

// 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"

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