15 条回复  ·  247 次点击
ysc3839 小成 2024-3-20 16:06:41
是 implicit-function-declaration ,直接用你给的参数类型作为定义了
leonshaw 小成 2024-3-20 16:42:30
@rookiemaster 当作隐式函数声明 int system(); 按 ABI 调用就行了
nuk 小成 2024-3-20 16:46:40
隐式声明,理论上默认的函数声明会是 int f(void),但是 gcc 实际上传递了参数,而且因为 X64 是 fastcall ,前几个参数用寄存器传递,所以就算参数数量对不上,也不会崩溃。你可以试试这样,一样不会崩溃:
system("echo hello world");
system("echo hello world", "echo hello world");
cnbatch 初学 2024-3-20 19:50:26
“隐式声明与实际调用的时候参数对不上”

不是对不上,而是因为 C 语言的特性。

在其它编程语言当中(比如 C++、Java 、C# ),int system();表示该函数不接受参数传入。

但 C 语言不同,int system(); 表示参数情况未知,是个笼统的声明。
而 int system(void) 才是其它编程语言 int system();的意思。

这里有比较详细的说明,在页面尾部 Note 那一节,句子以“Unlike in C++”开头:
https://en.cppreference.com/w/c/language/function_declaration
zeroxia 小成 2024-3-23 12:34:10
@nuk 到底默认是 `int f()` 还是 `int f(void)`?
chisato 小成 2024-7-12 13:22:23
#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <float.h>
#include <limits.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
12
返回顶部