当我查看有关GCC 8的新闻时,我看到他们增加了对2017版C语言的支持(不是C++ 17,真的是C17).但我在互联网上找不到任何关于它的信息.
它是像C11这样的新ISO版本,还是GCC团队用于编译器中某些更正的代号?
我std::abs()在浏览cppreference时读到了这个函数.
在那个页面上我也看到了一个std::labs()功能.它与其中一个std::abs()重载(一个用于long)具有相同的原型.
long abs( long n );
long labs( long n );
Run Code Online (Sandbox Code Playgroud)
和
long long abs( long long n );
long long llabs( long long n );
Run Code Online (Sandbox Code Playgroud)
所以,
std::labs()是什么?std::labs()?std::abs()和之间有什么区别std::labs()?当我浏览cppreference时,我在函数参数中看到了一个奇怪的类型数组,如下所示:
void f(double x[volatile], const double y[volatile]);
Run Code Online (Sandbox Code Playgroud)
那么,volatile关键字出现在数组下标中的目的是什么?它有什么作用?
我使用cppreference阅读了C++中的枚举声明.
然后我制作了Enum类并检查它是否是类类型或不使用std::is_class.
#include <iostream>
enum class Enum
{
red = 1, blue, green
};
int main()
{
std::cout << std::boolalpha;
std::cout << std::is_class<Enum>::value << '\n';
}
Run Code Online (Sandbox Code Playgroud)
然后我在Linux平台上编译并运行G ++编译器,它打印出false值.
所以类型是enum不是?如果枚举是一个类类型,那么为什么我会得到假值?
我已经在C++ 17编译器(Coliru)中编译并运行了以下程序.在程序中,我声明了一个extern变量,但没有定义它.但是,编译器不会给出链接器错误.
#include <iostream>
extern int i; // Only declaration
int func()
{
if constexpr (true)
return 0;
else if (i)
return i;
else
return -1;
}
int main()
{
int ret = func();
std::cout<<"Ret : "<<ret<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
为什么编译器没有给出链接器错误?
C11§6.5.7第5段:
结果
E1 >> E2是E1右移位E2位置.如果E1具有无符号类型或者E1具有有符号类型和非负值,则结果的值是商的整数部分E1 / 2*^E2.如果E1具有有符号类型和负值,则结果值是实现定义的.
但是,viva64参考文档说:
Run Code Online (Sandbox Code Playgroud)int B; B = -1 >> 5; // unspecified behavior
我在GCC上运行了这个代码,它总是给出一个输出-1.
所以,标准说"如果E1有一个带符号的类型和一个负值,结果值是实现定义的",但该文档说这-1>>5;是未指定的行为.
那么,-1>>5;C中是否有未指明的行为?哪个是对的?
#include <iostream>
using namespace std;
int main()
{
int arr[3] = { 10, 20, 30 };
cout << arr[-2] << endl;
cout << -2[arr] << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
4196160
-30
Run Code Online (Sandbox Code Playgroud)
这arr[-2]超出范围并且无效,导致未定义的行为.但-2[arr]评估为-30.为什么?
不arr[-2]等于-2[arr]?
不幸的是,在C中没有任何智能指针..但是有可能构建一个宏来包装变量声明并在离开声明变量的范围时使用该变量作为输入变量调用函数调用吗?
很抱歉这个长短语,但我正在使用xnu内核,你有许多内置引用计数器的元素,并且一定不要忘记在使用它时不用这个元素来避免内存泄漏.
例如,如果我有以下类型proc_t:
struct proc;
typedef struct proc * proc_t;
Run Code Online (Sandbox Code Playgroud)
我想在范围内基于此类型声明堆栈变量,例如:
{
proc_t_release_upon_exit proc_t proc_iter = proc_find(mypid);
//the rest of the code in this scope
}
Run Code Online (Sandbox Code Playgroud)
在预处理器分析宏之后和编译之前,我希望生成以下代码:
{
proc_t myproc = proc_find(mypid)
//the rest of the code in scope
proc_rele(myproc);
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在C中定义这样的宏?
码:
#include<iostream>
using namespace std;
int main()
{
size_t i = sizeof new int;
cout<<i;
}
Run Code Online (Sandbox Code Playgroud)
在GCC编译器中,工作正常,没有任何警告或错误和打印输出8.
但是,在clang编译器中,我收到了以下警告:
warning: expression with side effects has no effect in an unevaluated context [-Wunevaluated-expression]
size_t i = sizeof new int;
Run Code Online (Sandbox Code Playgroud)
sizeof new int;未定义的行为?我有一个switch案例程序:
升序订单开关案例:
int main()
{
int a, sc = 1;
switch (sc)
{
case 1:
a = 1;
break;
case 2:
a = 2;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
汇编代码:
main:
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], 1
mov eax, DWORD PTR [rbp-4]
cmp eax, 1
je .L3
cmp eax, 2
je .L4
jmp .L2
.L3:
mov DWORD PTR [rbp-8], 1
jmp .L2
.L4:
mov DWORD PTR [rbp-8], 2
nop
.L2:
mov eax, 0
pop rbp
ret …Run Code Online (Sandbox Code Playgroud)