C++ 哪一个更好:NULL还是false?

C++ 哪一个更好:NULL还是false?,c++,windows,sdl,C++,Windows,Sdl,我已经用SDL编程一段时间了,我决定制作一个头文件来简化我的编码。现在我有一个问题;如果我传递一个我不想要的函数参数,我应该这样做吗 test(NULL); 从Windows API中,我包括或 test(false); 我使用C++,而不是C.它完全取决于函数参数类型是什么。如果是指针,文档说明它是有效的,那么你可以通过C++ null (这只是在实际中 0代码/代码>)。 示例: // Bad; strlen expects a pointer to a real, existing

我已经用SDL编程一段时间了,我决定制作一个头文件来简化我的编码。现在我有一个问题;如果我传递一个我不想要的函数参数,我应该这样做吗

test(NULL);
从Windows API中,我包括或

test(false);

我使用C++,而不是C.

它完全取决于函数参数类型是什么。如果是指针,文档说明它是有效的,那么你可以通过C++ <代码> null <代码>(这只是在实际中<代码> 0代码/代码>)。 示例:

// Bad; strlen expects a pointer to a real, existing C-string buffer
std::cout << strlen(NULL);

/**
 * Function that does something.
 * 
 * @param ptr Pointer to buffer, or NULL to do nothing
 */
void myFunc(const char* ptr);

// OK; the function is designed to be ok with it
myFunc(NULL);
//坏;strlen需要一个指向真实的现有C字符串缓冲区的指针

它完全取决于函数参数的类型。如果是指针,文档说明它是有效的,那么你可以通过C++ <代码> null <代码>(这只是在实际中<代码> 0代码/代码>)。 示例:

// Bad; strlen expects a pointer to a real, existing C-string buffer
std::cout << strlen(NULL);

/**
 * Function that does something.
 * 
 * @param ptr Pointer to buffer, or NULL to do nothing
 */
void myFunc(const char* ptr);

// OK; the function is designed to be ok with it
myFunc(NULL);
//坏;strlen需要一个指向真实的现有C字符串缓冲区的指针

std::cout
null
是一个Java(和C#)关键字。它没有在C++代码中显示的业务。

<代码> null <代码>是java(和C)关键字。它没有在C++代码中显示的业务。

就是这样。VC++10已经可以了。GCC 4.6中的it是未来的发展方向。VC++10已经可以了。Tomalak在4.6中的回答是调用现有函数的好建议。当您正在编写函数(或您可以自由更改函数)并且希望参数是可选的时,您应该尝试对其进行设计,以使其用法正确、直观且具有自我记录功能。如果我们比较:

1) bool really_test = ...;
   test(really_test, my_test);
2) if (...)
       test(my_test);
3) test(... ? &my_test : NULL);
2) 如果使用
if
——一个普遍理解的关键字,而不是简单地暗示函数的第一个参数可以设置为绕过测试,则更容易理解。危险的情况是有人编写代码,比如3)记错或误解API;在满足空条件(可能是在prod中,而不是在测试中)之前,它一直工作得很好

类似地,当某些行为是可选的时,我更喜欢使用枚举来记录这些选项,而不是在调用站点上不进行任何通信的布尔值。对比

test(false);
test(true);
…与

test(Text_Output);
test(Html_Output);
如果有多个参数,那么可以使用诸如NULL之类的哨兵来指示其中一些参数不适用。如果参数类型不同,则更难出错:

test(my_test, /* output stream */ NULL, &error_counter, /* skip list */ NULL);
在这种用法中,如果意外省略参数或顺序错误,则可能会出现编译时错误

当编译器无法检查参数顺序/计数时,这很危险:

test(&my_test /* mandatory, this one has three stages */,
     /* stderr else out */ true, /* update counters */ false,
     /* skip 1st stage */ true, /* skip 2nd */ false, /* skip 3rd */ true);
那也许能满足

test(Test*, bool use_error_stream, bool update_counters, ...);
…这将是一个非常糟糕的API

请注意,引用强制指向有效对象,因此有些人喜欢在可能的情况下使用它们来传达选项是强制的这一事实。其他人认为更重要的是提示参数在调用站点是否可修改,并编写接受非常量指针的函数:

f(my_object);  // obviously mandatory, but is it const or not?

f(&my_object); // _might_ be modifiable (if that conventions followed),
               // but is it mandatory or not?

Tomalak的答案是调用现有函数的好建议。当您正在编写函数(或您可以自由更改函数)并且希望参数是可选的时,您应该尝试对其进行设计,以使其用法正确、直观且具有自我记录功能。如果我们比较:

1) bool really_test = ...;
   test(really_test, my_test);
2) if (...)
       test(my_test);
3) test(... ? &my_test : NULL);
2) 如果使用
if
——一个普遍理解的关键字,而不是简单地暗示函数的第一个参数可以设置为绕过测试,则更容易理解。危险的情况是有人编写代码,比如3)记错或误解API;在满足空条件(可能是在prod中,而不是在测试中)之前,它一直工作得很好

类似地,当某些行为是可选的时,我更喜欢使用枚举来记录这些选项,而不是在调用站点上不进行任何通信的布尔值。对比

test(false);
test(true);
…与

test(Text_Output);
test(Html_Output);
如果有多个参数,那么可以使用诸如NULL之类的哨兵来指示其中一些参数不适用。如果参数类型不同,则更难出错:

test(my_test, /* output stream */ NULL, &error_counter, /* skip list */ NULL);
在这种用法中,如果意外省略参数或顺序错误,则可能会出现编译时错误

当编译器无法检查参数顺序/计数时,这很危险:

test(&my_test /* mandatory, this one has three stages */,
     /* stderr else out */ true, /* update counters */ false,
     /* skip 1st stage */ true, /* skip 2nd */ false, /* skip 3rd */ true);
那也许能满足

test(Test*, bool use_error_stream, bool update_counters, ...);
…这将是一个非常糟糕的API

请注意,引用强制指向有效对象,因此有些人喜欢在可能的情况下使用它们来传达选项是强制的这一事实。其他人认为更重要的是提示参数在调用站点是否可修改,并编写接受非常量指针的函数:

f(my_object);  // obviously mandatory, but is it const or not?

f(&my_object); // _might_ be modifiable (if that conventions followed),
               // but is it mandatory or not?

#定义null-null
。请注意,
sscanf
是一个varargs函数,
null
只是一个整数,而不是指针,因此
null
作为
int
传递,而不是指针。即使
sscanf
确实支持为
%s
传递
NULL
,如果没有类型转换,它也不一定能工作。@bk1e:是的,也许是个坏例子。我已经用更好的编辑过了。谢谢
#定义空值
。请注意,
sscanf
是一个varargs函数,
null
只是一个整数,而不是指针,因此
null
作为
int
传递,而不是指针。即使
sscanf
确实支持为
%s
传递
NULL
,如果没有类型转换,它也不一定能工作。@bk1e:是的,也许是个坏例子。我已经用更好的编辑过了。谢谢你是指C++ 0x<代码> null pTr>代码吗?哎哟:对不起。我输入了null而不是false!我很糟糕>:)NULL只是0或0L的定义。空指针表示指针不指向对象。这是一个偏爱的问题,但是因为我们没有函数定义,很难说出你真正的意思。你是指C++ 0x<代码> null ptr>代码吗?哎哟:对不起。我输入了null而不是false!我很糟糕>:)NULL只是0或0L的定义。空指针表示指针不指向