C 与 C++ 40 年的爱恨情仇( 三 )


C是通用的、跨语言的胶水,可以将一切紧密地结合在一起 。
对于C++用户而言,C就是他们的API 。从这一点来看,C的价值在于其简单性 。请记住,C++关心的那一部分C是出现在接口(头文件)中的C 。我们关心的是声明,而不是定义 。C++需要调用C库中的函数(Python、Fortran、Rust、D、JAVA等语言也一样,在所有情况下都可以在接口边界使用C) 。
因此,C是一种接口定义语言 。向C添加的内容越多,定义接口就越困难 。这些接口随着时间的推移保持稳定的可能性较小 。
那么,C++中缺少<threads.h>是否重要?可能并不重要,因为这不太可能出现在公共接口中 。
 
如今大家都在谈论C过去,C的兼容性是C++的一大卖点 。但如今,每个人(甚至他们的金鱼)都懂C 。Rust可以调用C函数,Python、Java、一切语言都可以!甚至怪异的JavaScript都可以在WebAssemby中调用C函数 。
但是在这些语言中,接口是显式的 。该语言提供的工具可以公开特定的C声明 。当然,这比较麻烦 。但这可以让接口非常非常清晰 。而且还是有界的 。例如,在rust中,调用C函数并不会迫使Rust牺牲某些设计来容纳C子集 。实际上C是被包含进去的 。
mod confinment { use std::os::raw::{c_char}; extern "C" { pub fn puts(txt: *const c_char); }}pub fn main { unsafe { confinment::puts( std::ffi::CString::new("Hello, world!").expect("failed!").as_ptr ); }} 
编译器资源管理器除非C的ABI发生变化,否则这段代码可以一直正常运行 。而且Rust/C的边界非常清晰、不言自明 。
因此,C++可能是为C兼容性付出最多的语言 。
更糟糕的是,打开任何C的头文件,你很快就会发现一堆#ifdef __cplusplus 。没错,C++的兼容性往往需要大量C开发人员的工作 。兼容性一直是海市蜃楼 。很多人都知道我的这条推文:

C 与 C++ 40 年的爱恨情仇

文章插图
 
我们该何去何从?我认为两个委员会都在尝试更多地沟通 。他们计划明年在波特兰召开会议(尽管这个计划可能会变) 。沟通是一件好事 。
但是鸡同鸭讲的沟通效果会非常有限 。两种语言的设计支柱可能都不协调 。我会努力建议提供一个模板 。但是首先我得吐槽C语言没有模块、没有命名空间,以及整个宏是什么玩意儿 。
也许可以将C++能接受的C子集约束在C99上?也许两种语言都需要找到一个共同的子集并独立地发展?也许extern C需要影响解析 。如果C++经历了多个时代,那么C可能是其中之一 。
也许我们需要接受将C作为C++的子集,但唯一的方法是将WG14融入到WG21中 。
现状可能不会改变 。C++可能永远也无法从自己的起源中解脱,而C可能永远都要与那些顶着C语言之名的肮脏特性战斗 。
原文:https://cor3ntin.github.io/posts/c/
本文为 CSDN 翻译,转载请注明来源出处 。

【C 与 C++ 40 年的爱恨情仇】


推荐阅读