相关疑难解决方法(0)

C++或C中foo(void)和foo()之间有区别吗?

考虑这两个函数定义:

void foo() { }

void foo(void) { }
Run Code Online (Sandbox Code Playgroud)

这两者有什么区别吗?如果没有,为什么void那里的论点?美学原因?

c c++ arguments

243
推荐指数
3
解决办法
7万
查看次数

我应该在学习C++之前学习C语言吗?

我今天参观了大学CS系开放日,在实验室参观中,我们坐下来参加了本科生的几个最后一年的项目.一个特别好 - 一种FPS小行星游戏.我决定在src目录中查看它是用C++完成的(大多数其他项目都是Java 3D应用程序).

我以前没有做过任何C,但之前我已经查看了一些C代码.从我在这个游戏中的.cpp代码中看到的,它看起来并没有什么不同.

我有兴趣学习C或C++,但稍后可能会学习其他的.对我来说,先学习一个是否有任何优势,如果有,哪一个?

c c++

113
推荐指数
14
解决办法
14万
查看次数

哪里C不是C++的子集?

我在很多书中读到C是C++的一个子集.

有些书说C是C++的一个子集,除了细节之外.

代码在C中编译但在C++中编译的情况有哪些?

c c++

111
推荐指数
9
解决办法
2万
查看次数

为什么这个宏被替换为20而不是10?

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.

但是,根据我的理解,预处理器只是简单地替换文本.所以这就是我认为正在发生的事情(这显然是错误的但是很蠢):

  1. NUM定义为10.
  2. 因此,在第2行中,NUM被替换为10.所以现在我们有"#define FOO 10".
  3. NUM未定义.
  4. NUM已重新定义,现在为20.
  5. 根据第2行更换FOO,第2行在第4行重新定义之前,为10.

所以我认为输出应该是10而不是20.可以解释它出错的地方吗?

macros c-preprocessor

65
推荐指数
4
解决办法
2866
查看次数

将C++指针视为内存地址的可接受程度如何?

当你学习C++时,或者至少当我通过C++ Primer学习它时,指针被称为它们指向的元素的"内存地址".我想知道这是多少.

例如,做两个元素*p1*p2拥有属性,p2 = p1 + 1或者p1 = p2 + 1 当且仅当它们在物理内存中相邻时?

c++ hardware pointers

41
推荐指数
5
解决办法
2226
查看次数

为什么C++不支持堆栈上的动态数组?

在C99这是合法的:

void f(size_t sz) {
    char arr[sz];
    // ...
}
Run Code Online (Sandbox Code Playgroud)

但是,这个 - 动态大小的堆栈数组 - 已经在C++中被删除了,而没有在C++ 11中看到返回.

AFAIK C++是在考虑到C兼容性的情况下制作的,所以我想知道必须有一些非常好的论据,不包括这个有用的功能,对吗?

我能想到的就是:

优点

  • 允许更智能的阵列大小需要在堆栈上(临时缓冲区?),从而节省内存.
  • 减少"智能指针"(或更糟糕的是,手动错误引入delete [])和慢堆分配.
  • 与C99的兼容性.

缺点

  • 允许人们在堆栈上轻松分配过大的数组,从而产生难以调试的堆栈溢出.
  • 编译器编写者更复杂.

那么,为什么他们在导入其他C99功能时没有包含它?


为了防止这种情况被关闭为"主观"或"不具有建设性",我正在寻找来自委员会成员的引用或者讨论谈论此事的讨论的链接 - 当然还有快速的SO综述的奖励积分.

而不是将其视为小马与仓鼠的讨论,将其视为一个历史问题,仅仅关注所考虑的优势和劣势(如果有的话).


编辑:正如James McNellis在下面的评论中所指出的,C++标准化可变长度数组之前存在C++.你可能会把我的问题读作:" 为什么没有,他们不会添加它? ".

c++ standards stack dynamic-arrays

30
推荐指数
1
解决办法
6865
查看次数

C/C++使用malloc隐式void*cast

关于以下代码片段的问题

  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++编译器编译.这有什么标准要求吗?

c c++ language-lawyer

-1
推荐指数
1
解决办法
570
查看次数