请考虑以下程序(请参阅此处的实时演示).
#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++程序中暂停控制台的最佳方法?
cin.get()system("pause")getch()或等的C函数getchar()?使用system("pause")导致非可移植代码并且无法在UNIX中运行是真的吗?
cin.get()最好用于暂停控制台吗?
关于继承的访问修饰符的含义我很困惑.是什么涉及继承之间的区别private,protected以及public关键字?
我对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程序(请参阅此处的实时演示).
const int main = 195;
Run Code Online (Sandbox Code Playgroud)
我知道在现实世界中没有程序员编写这样的代码,因为它没有任何用处,也没有任何意义.但是当我const从程序上方删除关键字时,它会立即导致分段错误.为什么?我很想知道这背后的原因.
GCC 4.8.2在编译时会发出以下警告.
警告:'main'通常是一个函数[-Wmain]
Run Code Online (Sandbox Code Playgroud)const int main = 195; ^
为什么const关键字的存在和缺失会对程序的行为产生影响?
我正在读这篇关于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++中的基本类型没有像Java那样严格定义,其中a int始终为4个字节且long为8个字节等.据我所知,在C和C++中,只有a char被定义为1个字节,其他所有内容都由不同的编译器定义不同.所以int在C和C++中,只要它长于a short并且short更长,就不一定必须是4个字节char.
我只是想知道为什么会这样,它有用吗?
以下代码编译了广泛的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
我将一个未命名的临时对象传递给使用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
考虑以下计划:
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中编译.那么,上面的程序中发生了什么?