gpt4 book ai didi

c - 省略前向声明(原型(prototype))

转载 作者:太空狗 更新时间:2023-10-29 16:30:40 26 4
gpt4 key购买 nike

我已经完成了著名的“艰难地学习 C”在线类(class)的第 14 课。

在那节课中,它介绍了C 中前向声明的概念。代码示例中有两个前向声明。其中一个可以被注释掉,代码仍然可以编译,但是另一个不能被注释掉。对我来说,它们看起来同样重要。

这是代码。如果它们来自字母表,它只会打印出所有字符及其十六进制代码,否则会跳过它们。

两个编译器输出在代码的底部。有人可以解释为什么一个出错而另一个不出错吗?

#include <stdio.h>
#include <ctype.h>

// forward declarations
int can_print_it(char ch); //NOT OK to skip(??)
void print_letters(char arg[]); //OK to skip(??)

void print_arguments(int argc, char *argv[])
{
int i = 0;

for(i = 0; i < argc; i++) {
print_letters(argv[i]);
}
}

void print_letters(char arg[])
{
int i = 0;

for(i = 0; arg[i] != '\0'; i++) {
char ch = arg[i];

if(can_print_it(ch)) {
printf("'%c' == %d ", ch, ch);
}
}

printf("\n");
}

int can_print_it(char ch)
{
return isalpha(ch) || isblank(ch);
}


int main(int argc, char *argv[])
{
print_arguments(argc, argv);
return 0;
}

如果我注释掉第一个前向声明(仅第一个),会发生这种情况:

cc -Wall -g    ex14.c   -o ex14
ex14.c: In function ‘print_letters’:
ex14.c:24:9: warning: implicit declaration of function ‘can_print_it’ [-Wimplicit-function-declaration]
ex14.c: At top level:
ex14.c:32:5: error: conflicting types for ‘can_print_it’
ex14.c:33:1: note: an argument type that has a default promotion can’t match an empty parameter name list declaration
ex14.c:24:12: note: previous implicit declaration of ‘can_print_it’ was here
make[1]: *** [ex14] Error 1
make[1]: Leaving directory `/home/andrew/c_tutorials/lesson14/ex14_original'
make: *** [all] Error 2

如果我注释掉第二个声明(仅第二个声明),就会发生这种情况:

cc -Wall -g    ex14.c   -o ex14
ex14.c: In function ‘print_arguments’:
ex14.c:13:9: warning: implicit declaration of function ‘print_letters’ [-Wimplicit-function-declaration]
ex14.c: At top level:
ex14.c:17:6: warning: conflicting types for ‘print_letters’ [enabled by default]
ex14.c:13:9: note: previous implicit declaration of ‘print_letters’ was here
make[1]: Leaving directory `/home/andrew/c_tutorials/lesson14/ex14_original'

最佳答案

Well 编译器会提示为什么会发生这种情况。这里的关键是:

ex14.c:32:5: error: conflicting types for ‘can_print_it’
ex14.c:33:1: note: an argument type that has a default promotion can’t match an empty parameter name list declaration

can_print_it 的参数有一个默认提升,因此它不能有隐式声明。很棒的读物在这里:Default argument promotions in C function calls .基本上,can_print_it (char) 的参数类型与隐式声明一起使用是非法的。要使其工作,您需要使用适当的类型,对于 char,它是 int。对于其他类型,您可以查看链接的问题和答案。

print_letters 没有这样的参数,它的参数是指针类型。

旁注:如您所见,有 3 个错误答案时,人们会感到困惑。隐式声明不经常使用并且可能很棘手。一般来说,IMO,或者至少是实际应用,不鼓励使用它们。然而,它们是完全合法的。

关于c - 省略前向声明(原型(prototype)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23902625/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com