小编Des*_*tor的帖子

为什么`int;`在C中编译好,但在C++中没编译?

请考虑以下程序(请参阅此处的实时演示).

#include <stdio.h>
int main(void)
{
      int ;  // Missing variable name
      puts("Surprise");
}
Run Code Online (Sandbox Code Playgroud)

我的编译器gcc 4.8.1给出了以下警告:

[警告]空声明中无用的类型名称[默认启用]

为什么编译好?我不应该得到编译错误吗?当我将它编译为C++程序时,g ++ 4.8.1给出以下错误:

[错误]声明没有声明任何内容[-fpermissive]

c c++ gcc variable-declaration language-lawyer

57
推荐指数
3
解决办法
4532
查看次数

在C++程序中暂停控制台

哪个是在C++程序中暂停控制台的最佳方法?

  1. 运用 cin.get()
  2. 或使用 system("pause")
  3. 或使用像getch()或等的C函数getchar()

使用system("pause")导致非可移植代码并且无法在UNIX中运行是真的吗?

cin.get()最好用于暂停控制台吗?

c++

49
推荐指数
3
解决办法
22万
查看次数

什么是访问说明符?我应该继承私人,受保护还是公共?

关于继承的访问修饰符的含义我很困惑.是什么涉及继承之间的区别private,protected以及public关键字?

c++ private class protected

44
推荐指数
2
解决办法
16万
查看次数

是否保证std :: cout被初始化?

我对C++的了解是不应该假设全局实例的构造(和析构)的顺序.

当我用编译器std::cout和析构函数中使用的全局实例编写代码时,我遇到了一个问题.

std::cout也是iostream的全局实例.是否std::cout保证在任何其他全局实例之前进行初始化?

我写了一个简单的测试代码,它工作得很好,但我仍然不知道为什么.

#include <iostream>

struct test
{
    test() { std::cout << "test::ctor" << std::endl; }
    ~test() { std::cout << "test::dtor" << std::endl; }
};

test t;

int main()
{
    std::cout << "Hello world" << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它打印

test::ctor
Hello world
test::dtor
Run Code Online (Sandbox Code Playgroud)

代码是否有可能无法按预期运行?

c++ constructor global-variables

40
推荐指数
2
解决办法
5013
查看次数

为什么const int main = 195导致一个工作程序,但没有const它会以分段错误结束?

考虑使用C程序(请参阅此处的实时演示).

const int main = 195;
Run Code Online (Sandbox Code Playgroud)

我知道在现实世界中没有程序员编写这样的代码,因为它没有任何用处,也没有任何意义.但是当我const从程序上方删除关键字时,它会立即导致分段错误.为什么?我很想知道这背后的原因.

GCC 4.8.2在编译时会发出以下警告.

警告:'main'通常是一个函数[-Wmain]

const int main = 195;
          ^
Run Code Online (Sandbox Code Playgroud)

为什么const关键字的存在和缺失会对程序的行为产生影响?

c program-entry-point const segmentation-fault

32
推荐指数
2
解决办法
3958
查看次数

为什么C和C++编译器将显式初始化和默认初始化全局变量放在不同的段中?

我正在读这篇关于C程序内存布局的精彩帖子.它表示默认初始化全局变量驻留在BSS段中,如果您明确地为全局变量提供值,那么它将驻留在数据段中.

我已经在C和C++中测试了以下程序来检查这种行为.

#include <iostream>
// Both i and s are having static storage duration
int i;     // i will be kept in the BSS segment, default initialized variable, default value=0
int s(5);  // s will be kept in the data segment, explicitly initialized variable,
int main()
{
    std::cout<<&i<<' '<<&s;
}
Run Code Online (Sandbox Code Playgroud)

输出:

0x488020 0x478004
Run Code Online (Sandbox Code Playgroud)

因此,从输出中可以看出,变量i和s都存在于完全不同的段中.但是如果我从变量S中删除初始化程序(此程序中的初始值为5)然后运行程序,它会给我以下输出.

输出:

0x488020 0x488024
Run Code Online (Sandbox Code Playgroud)

因此,从输出中可以清楚地看出变量i和s都位于相同的(在这种情况下为BSS)段中.

这种行为在C中也是一样的.

#include <stdio.h>
int i;      // i will be kept in the BSS segment, default initialized …
Run Code Online (Sandbox Code Playgroud)

c c++ compiler-construction variables memory-management

27
推荐指数
3
解决办法
1458
查看次数

除了char之外,为什么sizeof内置类型在C&C++中依赖于编译器?

为什么C和C++中的基本类型没有像Java那样严格定义,其中a int始终为4个字节且long为8个字节等.据我所知,在C和C++中,只有a char被定义为1个字节,其他所有内容都由不同的编译器定义不同.所以int在C和C++中,只要它长于a short并且short更长,就不一定必须是4个字节char.
我只是想知道为什么会这样,它有用吗?

c c++ types

25
推荐指数
3
解决办法
2593
查看次数

为什么gcc和clang允许我构造一个抽象类?

以下代码编译了广泛的gcc和clang版本 - 在编译并使用gcc 5.3.1运行时,它会打印出来

一个()

然后以纯虚拟调用错误中止.

#include <stdio.h>

class A
{
public:
    A() {
        printf("A()\n");
    }
    virtual void b() const = 0;
};

int main()
{
    const A& a{};
    a.b();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我意识到绑定对临时的引用并不理想(虽然我认为这种情况被某种生命周期扩展所覆盖) - 但它也适用于尝试调用一个带有const引用的方法,如:

Foo({});
Run Code Online (Sandbox Code Playgroud)

为方便起见,这里是一个用clang 3.2 编译的例子:Compiler Explorer

c++ gcc abstract-class clang pure-virtual

24
推荐指数
1
解决办法
488
查看次数

为什么复制构造函数在通过const引用传递临时时被调用?

我将一个未命名的临时对象传递给使用const ref参数定义的函数.该类的副本是私有的,我收到编译错误.我不明白为什么在这种情况下调用复制构造函数.

class A {
public:
  A(int i) {}
private:
  A(const A&) {}
};

void f(const A& a)
{
}

int main()
{
  f(A(1)); // <-- error here: 'A::A(const A&)' is private
}
Run Code Online (Sandbox Code Playgroud)

正如所料,当我将主要更改为:

A a(1);
f(a);
Run Code Online (Sandbox Code Playgroud)

有用.

编辑:编译器是gcc 4.1.2

c++ gcc pass-by-reference copy-constructor

23
推荐指数
2
解决办法
4572
查看次数

在C&C++中使用const限定符指向数组的指针

考虑以下计划:

int main()
{
    int array[9];
    const int (*p2)[9] = &array;
}
Run Code Online (Sandbox Code Playgroud)

它在C++中编译得很好(请参见此处的实时演示),但在C中编译失败.默认情况下,GCC会发出以下警告.(见此处的现场演示).

prog.c: In function 'main':
prog.c:4:26: warning: initialization from incompatible pointer type [enabled by default]
     const int (*p2)[9] = &array;
Run Code Online (Sandbox Code Playgroud)

但如果我使用-pedantic-errors选项:

gcc -Os -s -Wall -std=c11 -pedantic-errors -o constptr constptr.c
Run Code Online (Sandbox Code Playgroud)

它给了我以下编译器错误

constptr.c:4:26: error: pointers to arrays with different qualifiers are incompatible in ISO C [-Wpedantic]
Run Code Online (Sandbox Code Playgroud)

为什么它在C中编译失败而在C++中没有?C&C++标准对此有何看法?

如果我在数组声明语句中使用const限定符,它也可以在C中编译.那么,上面的程序中发生了什么?

c c++ arrays pointers const

22
推荐指数
1
解决办法
2840
查看次数