考虑这两个函数定义:
void foo() { }
void foo(void) { }
Run Code Online (Sandbox Code Playgroud)
这两者有什么区别吗?如果没有,为什么void那里的论点?美学原因?
我今天参观了大学CS系开放日,在实验室参观中,我们坐下来参加了本科生的几个最后一年的项目.一个特别好 - 一种FPS小行星游戏.我决定在src目录中查看它是用C++完成的(大多数其他项目都是Java 3D应用程序).
我以前没有做过任何C,但之前我已经查看了一些C代码.从我在这个游戏中的.cpp代码中看到的,它看起来并没有什么不同.
我有兴趣学习C或C++,但稍后可能会学习其他的.对我来说,先学习一个是否有任何优势,如果有,哪一个?
我在很多书中读到C是C++的一个子集.
有些书说C是C++的一个子集,除了细节之外.
代码在C中编译但在C++中编译的情况有哪些?
1. #define NUM 10
2. #define FOO NUM
3. #undef NUM
4. #define NUM 20
5.
6. FOO
Run Code Online (Sandbox Code Playgroud)
当我只运行预处理器时,输出文件包含20.
但是,根据我的理解,预处理器只是简单地替换文本.所以这就是我认为正在发生的事情(这显然是错误的但是很蠢):
所以我认为输出应该是10而不是20.可以解释它出错的地方吗?
当你学习C++时,或者至少当我通过C++ Primer学习它时,指针被称为它们指向的元素的"内存地址".我想知道这是多少.
例如,做两个元素*p1并*p2拥有属性,p2 = p1 + 1或者p1 = p2 + 1 当且仅当它们在物理内存中相邻时?
在C99这是合法的:
void f(size_t sz) {
char arr[sz];
// ...
}
Run Code Online (Sandbox Code Playgroud)
但是,这个 - 动态大小的堆栈数组 - 已经在C++中被删除了,而没有在C++ 11中看到返回.
AFAIK C++是在考虑到C兼容性的情况下制作的,所以我想知道必须有一些非常好的论据,不包括这个有用的功能,对吗?
我能想到的就是:
delete [])和慢堆分配.为了防止这种情况被关闭为"主观"或"不具有建设性",我正在寻找来自委员会成员的引用或者讨论谈论此事的讨论的链接 - 当然还有快速的SO综述的奖励积分.
而不是将其视为小马与仓鼠的讨论,将其视为一个历史问题,仅仅关注所考虑的优势和劣势(如果有的话).
编辑:正如James McNellis在下面的评论中所指出的,C++标准化可变长度数组之前存在C++.你可能会把我的问题读作:" 为什么没有,他们不会添加它? ".
关于以下代码片段的问题
char *p = malloc(10);
Run Code Online (Sandbox Code Playgroud)
当我编译它gcc的任何-std=,这并编译好.
但是使用g ++,-std=这会产生错误:
w.c:4:21: error: invalid conversion from ‘void*’ to ‘char*’ [-fpermissive]
char *p = malloc(10);
Run Code Online (Sandbox Code Playgroud)
为什么行为不同?我认为用C编译的所有行都应该用C++编译器编译.这有什么标准要求吗?