我可以将默认参数设置为#defined值吗?
{{1}}
答案 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宏只会扩展为1920
和1080
。这将与:
void calculate(int width = 1920, int height = 1080) { // ...
根据您的情况,出于不同的原因,您可能更喜欢static const int
,而您可以找到on this answer;或者至少将WIDTH
和HEIGHT
重命名为更具体的内容,因为这似乎非常容易发生冲突。正如另一个答案所述,使用静态变量的一个优点是它们是作用域的。
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"
这甚至不会导致编译器错误,但更难以追踪错误。