所以今天我认为(int foo()事实上第一次)实际上不同于int foo(void)第一个允许任意数量的输入而第二个允许零.
是否int foo()只是忽略任何给定的输入?如果是这样,那么允许这种形式的功能有什么意义呢?如果没有,你怎么能访问它们,这与变量参数列表(例如类似的东西int foo (int argc, ...))有何不同?
请考虑以下代码:
#include<stdio.h>
int f()
{
printf(" hey ");
return 5;
}
int main()
{
printf("hello there %d",f(4,5));
f(4,5);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我期望函数'int f()'的参数太多,但即使在严格的C99编译中也能提供输出.为什么会这样?但似乎C++编译器会出错.
如果我传递的参数多于函数所需的参数,会发生什么情况?我预计被调用函数中的某些内容会被损坏,但在一些小型测试代码中一切正常。
例如:
void print()
{
int x=10;
printf("%d\n",x);
}
void main()
{
print(0,0,0,0,0);
}
Run Code Online (Sandbox Code Playgroud) 考虑下面的代码:
#include "list.h"
struct List
{
int size;
int* data;
};
List *list_create()
{
List *list;
printf("%d %d",sizeof(list),sizeof(List));
list = malloc(sizeof(list));
assert(list != NULL);
if (list != NULL) {
list->size = 0;
}
return list;
}
Run Code Online (Sandbox Code Playgroud)
打印出来的数字是“4 8”,我假设这是 List 对象中“int size”占用的 4 个字节?“int* data”的大小为 0 是因为没有分配给数据?int 指针的大小也是 4 个字节,所以 List 类型总共占用 8 个字节?或者还有其他事情发生?有人能帮我详细了解这一切吗?
那么 malloc() 从堆中获取 4 个字节并将地址分配给指针列表?如果我执行“list->data[i]=1;”,则稍后在 main 中 这会给我一个运行时错误为什么?是因为我不能改变堆中的内容吗?但是如果我做“list->size++”这会起作用,不是整个列表对象都在堆中吗?
这里真的需要一些帮助
提前致谢。
我注意到,当我在Visual Studio中创建一个新的C++类时,它会写下来Foo(void)并~Foo(void)作为构造函数和析构函数模板而不是Foo()和~Foo().但是,这两个版本似乎都有效.两者之间是否存在差异,或者根本不使用哪个版本?
以下是在C中使用函数指针:
#include <stdio.h>
void bar1(int i){printf("bar1 %d\n", i+1);}
void bar2(int i){printf("bar2 %d\n", i+2);}
void foo(void (*func)(), int i) {func(i);};
int main() {
foo(bar2, 0);
}
Run Code Online (Sandbox Code Playgroud)
它编译$gcc main.c.
以下是我尝试将其迁移到C++:
#include <cstdio>
void bar1(int i){printf("bar1 %d\n", i+1);}
void bar2(int i){printf("bar2 %d\n", i+2);}
void foo(void (*func)(), int i) {func(i);};
int main() {
foo(bar2, 0);
}
Run Code Online (Sandbox Code Playgroud)
试图编译它,我得到错误:
$ g++ main.cpp
main.cpp:7:39: error: too many arguments to function call, expected 0, have 1
void foo(void (*func)(), int i) {func(i);};
~~~~ ^
main.cpp:10:2: error: …Run Code Online (Sandbox Code Playgroud) 在Java中,这两个函数声明之间有什么区别吗?
public void foo() {/*...*/}
public void foo(void) {/*...*/}
Run Code Online (Sandbox Code Playgroud)
在这里你可以找到这个问题的答案,但对于C/C++.在这些语言中,两种声明风格的存在都是完全合理的.
但是在Java中这有什么意义呢?
我最近从Java转向学习C++,我是这种语言的新手,所以我需要你的帮助:)
有什么不同?
void method(void) {
}
Run Code Online (Sandbox Code Playgroud)
和
void method() {
}
Run Code Online (Sandbox Code Playgroud)
非常感谢!
c ×5
c++ ×3
pointers ×2
arguments ×1
c99 ×1
callstack ×1
compilation ×1
function ×1
heap-memory ×1
java ×1
methods ×1
parameters ×1
void ×1