小编msc*_*msc的帖子

什么是C17以及该语言有哪些变化?

当我查看有关GCC 8的新闻时,我看到他们增加了对2017版C语言的支持(不是C++ 17,真的是C17).但我在互联网上找不到任何关于它的信息.

它是像C11这样的新ISO版本,还是GCC团队用于编译器中某些更正的代号?

c gcc iso c11 c17

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

std :: labs()究竟是什么?

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()

c c++ prototype c++11 math-functions

46
推荐指数
1
解决办法
3137
查看次数

"volatile"关键字出现在数组下标中的目的是什么?

当我浏览cppreference时,我在函数参数中看到了一个奇怪的类型数组,如下所示:

void f(double x[volatile], const double y[volatile]);
Run Code Online (Sandbox Code Playgroud)

那么,volatile关键字出现在数组下标中的目的是什么?它有什么作用?

c arrays volatile function-parameter

43
推荐指数
2
解决办法
1722
查看次数

"enum class"是C++中的类类型吗?

我使用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++ enums c++11 c++17

41
推荐指数
2
解决办法
5750
查看次数

为什么这个"未定义的外部变量"不会导致C++ 17中的链接器错误?

我已经在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)

为什么编译器没有给出链接器错误?

c++ linker-errors extern c++17 if-constexpr

38
推荐指数
3
解决办法
3695
查看次数

是"-1 >> 5;" C中未指定的行为?

C11§6.5.7第5段:

结果E1 >> E2E1右移位E2位置.如果 E1具有无符号类型或者E1具有有符号类型和非负值,则结果的值是商的整数部分E1 / 2*^E2.如果E1具有有符号类型和负值,则结果值是实现定义的.

但是,viva64参考文档说:

int B;
B = -1 >> 5; // unspecified behavior
Run Code Online (Sandbox Code Playgroud)

我在GCC上运行了这个代码,它总是给出一个输出-1.

所以,标准说"如果E1有一个带符号的类型和一个负值,结果值是实现定义的",但该文档说这-1>>5;未指定的行为.

那么,-1>>5;C中是否有未指明的行为?哪个是对的?

c gcc bit-manipulation language-lawyer unspecified-behavior

38
推荐指数
2
解决办法
3151
查看次数

为什么arr [-2]不等于-2 [arr]?

#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++ arrays undefined-behavior

32
推荐指数
3
解决办法
8296
查看次数

在C中自动释放堆栈变量

不幸的是,在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中定义这样的宏?

c variables macros

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

是"sizeof new int;" 未定义的行为?

码:

#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;未定义的行为?

c++ g++ sizeof c++11 clang++

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

switch语句中的case的顺序是否会影响性能?

我有一个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)

c performance gcc switch-statement

31
推荐指数
5
解决办法
6911
查看次数