如何检查是否存在单个C++ 0x/C++ 11语言功能?我知道Clang有一个很好的系统.那么GCC,Visual Studio还是Boost呢?我想一种方法是检测编译器版本并将其与该版本中引入的功能相关联.但这很麻烦.有人已经这样做了吗?
以下代码可以使用 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
我想用 和 的标记分割字符串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 支持该示例,因此该示例应该可以工作。
我只是想知道,是否有可能指示GCC(或其他编译器)我不想在我的C代码中区分大小写?
如果那是不可能的,那么另一个选择是让一个编译器标志在找到两个具有相同名称和不同外壳的全局变量/函数时抛出错误.
今天我发现 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 的代码。
在 GCC 中,我需要使用__attribute__((packed))使结构占用最少的空间,例如,如果我有大量的结构,我应该将它们打包。还有哪些常见的编译器会进行结构填充,以及如何在这些其他编译器中打包结构?
Sonarqube 会产生代码问题,例如错误和安全相关问题(例如可能导致问题的漏洞和代码异味)。有没有办法添加编码标准来强制执行特定于代码的可读性和可维护性以及代码审查者在代码中执行的更多约定。因此,如果不满足注释、变量约定以及类和函数标准,它就会自动通过质量门。但我的一位开发人员说 Sonarqube 默认配置文件涵盖了代码审阅者在代码中检查的大部分规则和约定。但我理解,编码标准文档中的规则和约定只能通过同行评审来评审,而不能通过编译器和 Sonarqube 工具来评审。
我相信Sonarqube和编译器的开发人员和专家可以确认编码标准中的规则和约定是否存在,例如源代码的通用风格,语句、方法的标准,命名约定,变量赋值,类、接口、包的标准等。一种通过Sonarqube添加编码标准规则的方法,请分享?
[编辑]
我已经为我的班级写了这个程序.我发现它使用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)