我正在阅读一本使用 C的书(Butenhof 的POSIX 线程编程,1997 年),我遇到了以下行:
(void)free(data);
Run Code Online (Sandbox Code Playgroud)
这里,data只是一个指向已分配结构的指针,
data = malloc(sizeof(my_struct_t));
Run Code Online (Sandbox Code Playgroud)
为什么是free被强制转换的结果void?
根据我对 C 的理解,这似乎没有意义,原因有两个:
void这本书写于 1997 年。这是某种遗产吗?
作者提到这些示例是在 Digital Unix 4.0d 上运行的,但如果您不打算使用该结果,我仍然无法想象有理由强制转换该函数的结果。
以下Java代码无法编译:
@FunctionalInterface
private interface BiConsumer<A, B> {
void accept(A a, B b);
}
private static void takeBiConsumer(BiConsumer<String, String> bc) { }
public static void main(String[] args) {
takeBiConsumer((String s1, String s2) -> new String("hi")); // OK
takeBiConsumer((String s1, String s2) -> "hi"); // Error
}
Run Code Online (Sandbox Code Playgroud)
编译器报告:
Error:(31, 58) java: incompatible types: bad return type in lambda expression
java.lang.String cannot be converted to void
Run Code Online (Sandbox Code Playgroud)
奇怪的是标记为"OK"的行编译得很好,但标记为"Error"的行失败了.他们看起来基本相同.
想象一下以下代码:
void DoThis()
{
if (!isValid) return;
DoThat();
}
void DoThat() {
Console.WriteLine("DoThat()");
}
Run Code Online (Sandbox Code Playgroud)
在void方法中使用return是否可以?它有任何性能损失吗?或者写一个这样的代码会更好:
void DoThis()
{
if (isValid)
{
DoThat();
}
}
Run Code Online (Sandbox Code Playgroud) 我正在ResponseHandler为apache HttpClient包实现一个,如下所示:
new ResponseHandler<int>() {
public int handleResponse(...) {
// ... code ...
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
但我希望handleResponse函数不返回任何东西,即void.这可能吗?以下内容无法编译,因为void它不是有效的Java类型:
new ResponseHandler<void>() {
public void handleResponse(...) {
// ... code ...
}
}
Run Code Online (Sandbox Code Playgroud)
我想我可以代替void用Void返回一个Void对象,但是这并不是我真正想要的东西.问:是否有可能组织这次回调的情况以这样的方式,我可以返回void从handleResponse?
我目前正在重构/整理C++项目中使用的一些旧C代码,并定期查看以下函数:
int f(void)
Run Code Online (Sandbox Code Playgroud)
我倾向于写作:
int f()
Run Code Online (Sandbox Code Playgroud)
是否有任何理由不在整个代码库中用()替换(void)以提高一致性,或者两者之间是否存在我不知道的细微差别?更具体地说,如果C++中的虚拟成员函数被描述为:
virtual int f(void)
Run Code Online (Sandbox Code Playgroud)
派生类包括成员函数:
int f()
Run Code Online (Sandbox Code Playgroud)
这是一个有效的覆盖?另外,基于几乎相同的签名,我是否可能遇到任何链接器问题?
在python 3.x中,通常使用函数的返回类型注释,例如:
def foo() -> str:
return "bar"
Run Code Online (Sandbox Code Playgroud)
"void"类型的正确注释是什么?
我正在考虑3种选择:
def foo() -> None:
None不是一个类型,def foo() -> type(None):
NoneType,def foo():
选项2.对我来说似乎最合乎逻辑,但我已经看到了一些1的实例.
我正在寻找一个路径查找教程,我注意到方法return内部的一个语句void(类PathTest,第126行):
if ((x < 0) || (y < 0) || (x >= map.getWidthInTiles()) || (y >= map.getHeightInTiles())) {
return;
}
Run Code Online (Sandbox Code Playgroud)
我是Java的新手.谁能告诉我它为什么存在?据我所知,return不允许在void方法中使用.
我的项目中有一些静态的util方法,其中一些只是传递或抛出异常.关于如何模拟具有除void之外的返回类型的静态方法,有很多例子.但是我如何模拟一个将void返回到" doNothing()" 的静态方法?
非void版本使用以下代码行:
@PrepareForTest(StaticResource.class)
Run Code Online (Sandbox Code Playgroud)
...
PowerMockito.mockStatic(StaticResource.class);
Run Code Online (Sandbox Code Playgroud)
...
Mockito.when(StaticResource.getResource("string")).thenReturn("string");
Run Code Online (Sandbox Code Playgroud)
但是,如果应用于StaticResources返回void,编译将抱怨when(T)不适用于void ...
有任何想法吗?
一个解决方法可能是让所有静态方法返回一些Boolean成功,但我不喜欢变通方法.
从函数返回更正确的方法是:
void function() {
// blah some code
}
Run Code Online (Sandbox Code Playgroud)
要么
void function() {
// blah some code
return;
}
Run Code Online (Sandbox Code Playgroud)
第二种方式的理由:
假设你有这样的场景 - 你有很多函数,你必须在这些函数的末尾注入一些代码.但由于某些原因,您不希望/或无法修改如此大量的功能.你能做些什么?Return并macro发挥作用,例如:
#include<stdio.h>
#define MAX_LINES 1000
#define XCAT(a,b) a##b
#define CAT(a,b) XCAT(a,b)
#define return returns[__LINE__] = 1;\
if (returns[__LINE__])\
{printf("End of function on %d line.\n",__LINE__);}\
int CAT(tmp,__LINE__); \
if ((CAT(tmp,__LINE__)=returns[__LINE__], returns[__LINE__] = 0, CAT(tmp,__LINE__)))\
return
static int returns[MAX_LINES];
void function1(void) {
return;
}
void function2(void) {
return;
}
int main()
{
function1();
function2(); …Run Code Online (Sandbox Code Playgroud) void ×10
java ×4
c ×3
mocking ×2
return ×2
annotations ×1
c# ×1
c++ ×1
casting ×1
easymock ×1
free ×1
function ×1
java-8 ×1
lambda ×1
legacy-code ×1
methods ×1
mockito ×1
powermock ×1
python ×1
refactoring ×1
return-type ×1
static ×1
type-hinting ×1
unit-testing ×1