"void fatal(char *); " 是什么意思?

What does "void fatal(char *); " mean?

我刚开始学习 C,我在给出的一个例子中遇到了这个,我知道这是一个函数原型,但我还没有完全理解的概念是

void function(char *);

意思是当我最终声明函数时,它会像这样接受一个参数 char 指针参数

void function(char *arg){}

?

它只是告诉编译器函数采用什么类型的参数以及它的 return 类型是什么。

int main()
{
    double x = foo(1,2);
}

void foo(double x)
{
   printf("%f", x);
}

在此编译器中不知道函数 foo 的参数是什么以及如何正确传递它们。 Return 类型也未知。编译器会假设它们是 int - 在这种情况下这不是事实

https://godbolt.org/z/J8juc4

这里void function(char *);是一个函数原型,它只是一个函数的声明,指定了函数的名称、参数和return类型。它不包含函数体。

它向编译器提供了该函数稍后可能会在程序中使用的信息。

如果自定义函数定义在main()函数之前,则不需要

只是回答你提出的问题:

What does “void fatal(char *);” mean?

这是函数 fatal 的 prototype/declaration。fatal 是一个函数,它将指向 char 的指针作为唯一参数。

void 是函数的 return 类型,在这种情况下意味着函数不会 return 给它的调用者一个值,或者如果有,值 returned 被调用者解释为无效。


函数fatal()的prototype/declaration对编译器很重要。这样,编译器首先会得到"known",这个函数在后面的程序中是如何使用的,但是次要的也会检查函数的定义、声明和使用之间是否有任何不一致。


在 C 中,您可以在函数声明中省略指向 char 的指针的特定标识符,但不能在定义中省略。这是 C 不同于 C++ 的情况;在 C++ 中,也允许在定义中省略标识符。您可以在this answer.

中查看标准中的相应短语

所以在 C 中 fatal 的定义中你必须为 char 指针提供一个标识符:

// Definition of function fatal().
void fatal(char *a)
{
    printf("The string of (a) is: %s\n",a);      
}

但你可以在声明中省略这一项:

void fatal(char *);

注意:调用函数时提供的参数和函数声明中指定的参数之间的标识符可能不同, 比如:

// Declaration (Protoype) of function fatal().
void fatal(char* a);   // parameter a (pointer to char);

int main()
{
    char b[] = "Hello";        // Declaration and Initialization of array b.
    printf("Let´s use the function fatal to print what the string in b is   
            contained of!\n");
    fatal(b);                  // when given as argument to a function, b 
                               // is a pointer to the first element of the char 
                               // array of b.
}

// Definition of function fatal().
void fatal(char* a)
{
    printf("The string of (a) is: %s\n",a);      
}

在此处查看有关参数和参数之间差异的更多信息:What's the difference between an argument and a parameter?


从更远的角度来看,"pass by value"和"pass by reference"之间也有一个重要的区别。指针 argument/parameter 始终是按引用传递。这两者具体是什么以及它们之间的区别在这里得到了最好的解释:What's the difference between passing by reference vs. passing by value?

在这个上下文和范围可见性的上下文中,了解您是否有 f.e 也很重要。标识符 x 引用函数 fatal 中的对象,可以在调用者中使用相同的标识符 x,反之亦然,在每个函数中引用完全不同的对象范围。 - 意味着,您可以为不同范围内的不同对象使用相同的标识符(名称),但每个标识符只能在其范围内使用一次。

does [...] mean when I finally declare the function, it is going take an argument char pointer argument [...] ?

是的,确实如此。

函数的声明的重要之处在于参数的类型。声明中不需要参数名称

void function(char *);

但仅在函数的 定义中

void function(char *arg)
{
}

.