首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C与C++函数问题

C与C++函数问题
EN

Stack Overflow用户
提问于 2012-10-05 17:32:37
回答 6查看 1.4K关注 0票数 3

我正在学习C,在开始学习C++作为我的第一门编译语言后,我决定“回到基础”,学习C。

关于每种语言处理函数的方式,我有两个问题。

首先,为什么C“不在乎”定义函数的作用域,而C++“关心”呢?

例如,

代码语言:javascript
运行
复制
int main()
{
    donothing();
    return 0;
}

void donothing() { }

上面的代码不能在C++编译器中编译,而可以在C编译器中编译。为什么会这样呢?C++在很大程度上不是仅仅是C语言的一个扩展,应该是“向后兼容”的吗?

其次,我找到的书(Link to pdf)似乎没有为main函数声明返回类型。我四处查看,发现了其他书籍和网站,它们通常也没有指定main函数的返回类型。如果我试图编译一个没有为main指定返回类型的程序,它在C编译器中编译得很好(尽管有一些警告),但它不能在C++编译器中编译。再问一次,为什么会这样?总是将返回类型指定为整数而不是省略它是更好的风格吗?

谢谢你的帮助,顺便说一句,如果有人能推荐一本我应该买的更好的书,那就太好了!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-10-05 17:36:14

首先,为什么C“不在乎”定义函数的作用域,而C++“关心”呢?

实际上,C确实关心。只是C89允许隐式声明函数,并将其返回类型推断为int,并从使用中推断其参数。C99不再允许这样做。

因此,在您的示例中,就好像您已将原型声明为

代码语言:javascript
运行
复制
int dosomething();

隐式返回类型也是如此:缺少的返回类型在C89中被推断为int,而不是C99。使用gcc -std=c99 -pedantic-errors编译您的代码会产生类似以下的结果:

代码语言:javascript
运行
复制
main.c: In function 'main':
main.c:2:5: error: implicit declaration of function 'donothing' [-Wimplicit-function-declaration]
main.c: At top level:
main.c:5:6: error: conflicting types for 'donothing'
main.c:2:5: note: previous implicit declaration of 'donothing' was her

为了便于记录,下面是我使用的代码:

代码语言:javascript
运行
复制
int main() {
    donothing();
    return 0;
}
void donothing() { }
票数 6
EN

Stack Overflow用户

发布于 2012-10-05 17:35:06

这是因为C++支持可选参数。当C++看到donothing();时,它无法判断donothing是否是:

代码语言:javascript
运行
复制
void donothing(void);

代码语言:javascript
运行
复制
void donothing(int j = 0);

在这两种情况下,它必须传递不同的参数。这也是因为C++比C更强的类型。

票数 3
EN

Stack Overflow用户

发布于 2012-10-05 17:55:23

上面的代码不能在C++编译器中编译,而可以在C编译器中编译。为什么会这样呢?

因为C++要求函数的声明(或定义)在调用点的作用域中。

不是C++,主要只是C++的一个扩展

不完全同意。它最初基于一组C扩展,它引用C标准(经过一些修改)来定义来自C的标准头的内容。C++“语言本身”类似于C,但不是它的扩展。

,应该主要是“向后兼容”?

强调“大部分”。即使它这样做了,它也不总是有相同的含义。

我四处查看,发现了其他书籍和网站,它们通常也没有为main函数指定返回类型

C和C++标准总是说main返回int

在C89中,如果您省略了一个函数的返回类型,那么它将被假定为int。C++和C99都缺少这种隐式的int返回类型,但是许多C教程和教程(以及编译器和代码)仍然使用C89标准。

C允许实现接受其他返回类型,但不允许可移植程序请求它们。

C99中删除的功能在某种程度上被认为是有害的。甚至不值得尝试编写同时使用C和C++的代码,除非是在用于两种语言之间互操作的头文件中。

我决定“回到基础”,学习C语言。

这经常被C的用户引用为C的一个优点,而被C++的用户引用为C++的一个优点。有时,这些用户是出于不同目的使用语言的同一批人。

因此,你在学习C语言时学到的东西可能会影响你编写C++的方式,也可能不会。如果是这样的话,这可能会变得更好,也可能不会。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12743445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档