标签: compiler-specific

C++ 11功能检查

如何检查是否存在单个C++ 0x/C++ 11语言功能?我知道Clang有一个很好的系统.那么GCC,Visual Studio还是Boost呢?我想一种方法是检测编译器版本并将其与该版本中引入的功能相关联.但这很麻烦.有人已经这样做了吗?

c++ language-features compiler-specific c++11

7
推荐指数
1
解决办法
1504
查看次数

函数类型别名声明中是否允许嵌套括号?

以下代码可以使用 gcc-13 和 clang-16 编译,但 MSVC 报告多个错误

using foo_type = void ((((int, const char*))));   // (1)
// Compiler messages for line (1):
//    clang-16: ok.
//    gcc-13:   ok.
//    MSVC-v19: error C2062: type 'int' unexpected.


foo_type foo;

int main()
{
    foo(5, "Hello");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

问题是:谁是对的?标准是否允许alias-declaration函数类型在参数列表周围有多个嵌套括号,就像上面的示例中所尝试的那样?

c++ language-lawyer compiler-specific c++17 alias-declaration

7
推荐指数
1
解决办法
178
查看次数

MSVC 上的“std::views::split”

我想用 和 的标记分割字符串std::views::split,并为每个检索到的子字符串调用该std::from_chars函数。这是一个 MRE ( https://godbolt.org/z/1K71qo9s4 ),它在 GCC 上编译成功,但在 MSVC 上编译失败:

#include <iostream>
#include <ranges>
#include <string>
#include <charconv>
 
 
int main()
{
    std::string source{"10%15%20%35"};
    for ( auto i : source | std::views::split('%') )
    {
        int x;
        std::from_chars( i.begin().base(), i.end().base(), x );
        std::cout << x << ' ';
    }
}
Run Code Online (Sandbox Code Playgroud)

奇怪的是,根据cppreference , P2210R2中的行为std::views::split发生了变化,提供了效果为base()

相当于return cur_

然后,根据编译器支持页面P2210R2自 19.31 起 MSVC 支持该示例,因此该示例应该可以工作。

c++ stl compiler-specific c++20 std-ranges

5
推荐指数
1
解决办法
217
查看次数

是否存在允许不区分大小写的C编译器标志?

我只是想知道,是否有可能指示GCC(或其他编译器)我不想在我的C代码中区分大小写?

如果那是不可能的,那么另一个选择是让一个编译器标志在找到两个具有相同名称和不同外壳的全局变量/函数时抛出错误.

c programming-languages c99 compiler-specific

3
推荐指数
1
解决办法
186
查看次数

GCC是如何优化这个‘switch’的

今天我发现 GCC 在优化这段代码中的开关方面发挥了一些神奇的作用:

StairsType GetStairsType(uint8_t tileId, uint8_t dlvl)
{
    if (dlvl == 0)
        return StairsType::Part;
    if (tileId == 48) {
        return dlvl >= 21 ? /* Crypt */ StairsType::Down : /* Caves */ StairsType::Part;
    }
    switch (tileId) {
    case 57: return StairsType::Down;
    // many more tile IDs go here
    }
}
Run Code Online (Sandbox Code Playgroud)

看看这个:

https://godbolt.org/z/snY3jv8Wz

(gcc在左边,clang在右边)

不知何故,与 Clang 相比,GCC 设法将其编译为 1/4 的代码。

  1. 从概念上讲,这个 asm 的作用是什么?
  2. 海湾合作委员会是如何做到这一点的?

c++ gcc clang switch-statement compiler-specific

2
推荐指数
1
解决办法
319
查看次数

我需要担心其他哪些编译器来处理结构体打包?

在 GCC 中,我需要使用__attribute__((packed))使结构占用最少的空间,例如,如果我有大量的结构,我应该将它们打包。还有哪些常见的编译器会进行结构填充,以及如何在这些其他编译器中打包结构?

c compiler-specific

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

Sonarqube 支持或不支持强制执行编码标准的规则

Sonarqube 会产生代码问题,例如错误和安全相关问题(例如可能导致问题的漏洞和代码异味)。有没有办法添加编码标准来强制执行特定于代码的可读性和可维护性以及代码审查者在代码中执行的更多约定。因此,如果不满足注释、变量约定以及类和函数标准,它就会自动通过质量门。但我的一位开发人员说 Sonarqube 默认配置文件涵盖了代码审阅者在代码中检查的大部分规则和约定。但我理解,编码标准文档中的规则和约定只能通过同行评审来评审,而不能通过编译器和 Sonarqube 工具来评审。

我相信Sonarqube和编译器的开发人员和专家可以确认编码标准中的规则和约定是否存在,例如源代码的通用风格,语句、方法的标准,命名约定,变量赋值,类、接口、包的标准等。一种通过Sonarqube添加编码标准规则的方法,请分享?

[编辑]

java compiler-specific code-standards sonarqube

0
推荐指数
1
解决办法
3388
查看次数

为什么这个C++程序在某些编译器中有效但在其他编译器中却不行?c ++编译器之间的主要区别是什么?

我已经为我的班级写了这个程序.我发现它使用GNU g ++编译器编译并运行得很好.我的教授从他的网站自动评分我们的程序,该网站使用Microsoft Visual Studio编译器,它会引发错误.我也在BSD clang编译器中尝试过这个程序,我得到了一个完全不同的错误.

#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>

using namespace std;
double dec2Bin(int value, char binaryString[])
{
    int x = 1;
    string hold = "";
    while(x <= value){
        x *= 2;
    }
    x /= 2;

    while(x >= 1){
        //cout << x << " ";
        if(value > x){
            hold += "1";
            value -= x;
        }
        else if(value < x){
            hold += "0";
        }
        else if(value == x){
            hold += "1";
            value = 0;
            //return hold; …
Run Code Online (Sandbox Code Playgroud)

c++ g++ clang visual-c++ compiler-specific

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