小编Zos*_*oso的帖子

在#include语句中使用乱码字符时没有编译器错误

#include <iostream> gfhgfhgf
using namespace std;

int main() {
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么这段代码片段会被编译?根据包含语法的gcc参考:

如果文件名后面的行上有任何内容(注释除外),则会出错.

而这正是代码中正在做的事情.

c++ compiler-errors c-preprocessor

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

extern "C" 变量受编译器优化级别影响

考虑这个带有片段的链接

#include <cstdio>

namespace X {
    extern "C" int z;
}

namespace Y {
    extern "C" int z;
}

int X::z = 1;
int main()
{
    std::printf("%d -- %d\n", X::z, Y::z);
    X::z = 2;
    Y::z = 4;
    std::printf("%d -- %d\n", X::z, Y::z);
    X::z = 0;
    std::printf("%d -- %d\n", X::z, Y::z);
}
Run Code Online (Sandbox Code Playgroud)

-O1GCC 输出

1 -- 1
2 -- 4
0 -- 0
Run Code Online (Sandbox Code Playgroud)

而未启用优化的 GCC 的输出与 CLANG 的输出匹配(在所有优化级别),即

1 -- 1
4 -- 4
0 -- 0
Run Code Online (Sandbox Code Playgroud)

这是 …

c++ gcc

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

使用 typeof 和 decltype 定义数组时出现编译器错误

A)这有效:

int main() {
    int * a = new int[5];
    delete[] a;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

B)这个错误:

int main() {
    int * a = new typeof(*a)[5];
    delete[] a;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

出现错误:数组下标的类型“int[int]”无效

C)这有效:

int main() {
    int * a = new typeof(a)[5];
    delete[] a;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么 B 失败,因为扩展后的语句应该如下所示:

int *a = new int[5];
Run Code Online (Sandbox Code Playgroud)

因为typeof(*a)是 int。

这是 decltype 的实验:

D)这不起作用:

int main() {
    int * a = new decltype(a)[5];
    delete[] a;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

出现错误:无法在初始化时将 'int**' 转换为 'int*'。这是预期的,因为 …

c++ typeof decltype

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

内存对齐公式

在浏览一些内核代码时,我发现了一个内存对齐公式:

对齐 = ((操作数 + (对齐 - 1)) & ~(对齐 - 1))

所以我什至为此编写了一个程序:

#include <stdio.h>

int main(int argc, char** argv) {
    long long operand;
    long long alignment;
    if(argv[1]) {
        operand = atol(argv[1]);
    } else {
        printf("Enter value to be aligned!\n");
        return -1;
    }
    if(argv[2]) {
        alignment = strtol(argv[2],NULL,16);
    } else {
        printf("\nDefaulting to 1MB alignment\n");
        alignment = 0x100000;
    }
    long long aligned = ((operand + (alignment - 1)) & ~(alignment - 1));
    printf("Aligned memory is: 0x%.8llx [Hex] <--> %lld\n",aligned,aligned);
    return …
Run Code Online (Sandbox Code Playgroud)

c bit-manipulation

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

在调试视图层次结构中查看 CALayers

我试图根据文档在 Objective-C 中使用层托管视图

view.layer = [CALayer new];  // Create a layer-hosting view as opposed to a layer-backed view
view.wantsLayer = YES;
Run Code Online (Sandbox Code Playgroud)

我继续使用此层托管视图通过使用 附加更多层来支持层的层次结构addSubLayer

现在我的问题是是否可以CALayer调试视图层次结构中查看这些子项/托管?我只看到NSViews 但看不到托管层。我正在寻找类似于 Visual Studio 中可用的东西实时视觉树,它显示平台视图和视觉层。

XCode 版本:11.3

xcode core-animation objective-c

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

模板参数推导在 C++14 上失败

我试图编译这段代码,但它在C++14运行时失败C++17

#include <cstdio>
#include <utility>

template <typename F>
struct S {
    explicit S(F&& fn): fn(std::move(fn)) {}
    F fn;
    ~S() { fn(); }
};


int main(){
    S obj([]() noexcept {
        std::printf("Foo\n");
    });                                                                                                 
}
Run Code Online (Sandbox Code Playgroud)

看到在 的C++17构造函数中S已被调用为

   call    S<main::{lambda()#1}>::S(main::{lambda()#1}&&)
Run Code Online (Sandbox Code Playgroud)

这表明编译器推导了模板参数。C++14除了执行以下操作之外,还有其他方法可以编译此代码吗?

auto fn = []() noexcept {
    std::printf("Foo\n");
};
S<decltype(fn)> obj(std::move(fn)); 
Run Code Online (Sandbox Code Playgroud)

c++ templates

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

这个指针别名如何工作?

https://kukuruku.co/post/i-do-not-know-c/

问题#7:

#include <stdio.h>
void f(int *i, long *l)
{
  printf("1. v=%ld\n", *l); /* (1) */
  *i = 11;                  /* (2) */
  printf("2. v=%ld\n", *l); /* (3) */
}
int main()
{
  long a = 10;
  f((int *) &a, &a);
  printf("3. v=%ld\n", a);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

小端系统上两个不同编译器的输出是:

1. v=10    2. v=11    3. v=11
1. v=10    2. v=10    3. v=11
Run Code Online (Sandbox Code Playgroud)

第二个结果怎么可能?我通过引用严格别名来解释结果的解释并不完全.编译器是否完全忽略第(2)行?

c pointers strict-aliasing language-lawyer type-punning

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

MSVC 上的 NULL 行为

我正在尝试这个代码片段

#include <cstddef>
#include <cstdio>

void f(int* ptr){
    std::printf("int*\n");
}

void f(int val){
    std::printf("int\n");
}

int main() {
    f(NULL);
}
Run Code Online (Sandbox Code Playgroud)

这在 GCC 和 CLANG 上都会出错,但 MSVC 会打印int。根据我对 的阅读,由于整型的[conv.ptr]空指针常量(实际上是NULL)可以转换为指针类型,因此编译器在选择适当的函数时应该是不明确的,因为它可以绑定到和。我确认所有这些编译器都已通过以下方式实现为整数类型intint*NULL

#if defined(_MSC_VER)
    static_assert(std::is_same<decltype(NULL), int>(), "");
#else
    static_assert(std::is_same<decltype(NULL), long>(), "");
#endif
Run Code Online (Sandbox Code Playgroud)

那么,这是 MSVC 错误还是我遗漏了某些内容并且编译器在这种情况下不会抛出错误?

编辑:我知道这nullptr是衡量空性的方法,但这个问题仅仅是出于好奇并试图理解围绕它的规范。

c++ visual-c++

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

如何防止类被malloc化,只允许新的?

在某些情况下,我想强制调用构造函数,该构造函数在new中自动调用,而不是在malloc中调用(在这种情况下,我们必须使用placement new技术).有没有办法让类只适用于new而不是malloc?

编辑:编译时间限制将是更可取的(像往常一样,我猜).

c++ malloc new-operator

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

初始化字符串对数组而不提及显式类型

我正在尝试初始化std::arrayof std::pair<std::string, std::string>,但如果不明确包含类型,则无法在调用站点执行此操作std::pair

这是完整的可执行代码链接,以下是相关片段:

以下是别名和声明:

static constexpr size_t NUM_DATA = 3;
using DataPair = std::pair<std::string, std::string>;
using Mapping = std::array<DataPair, NUM_DATA>;

static std::shared_ptr<Foo> create(Mapping&& list);

explicit Foo(Mapping&& pairs);
Run Code Online (Sandbox Code Playgroud)

这是调用站点的代码:

auto x= Foo::create({
    Foo::DataPair{"k1", "v1"}, 
    Foo::DataPair{"k2", "v2"}, 
    Foo::DataPair{"k3", "v3"}
});
// DOESN'T COMPILE!
// auto x= Foo::create({
//     {"k1", "v1"}, 
//     {"k2", "v2"}, 
//     {"k3", "v3"}
// });
Run Code Online (Sandbox Code Playgroud)

我的目标是 C++14。我想避免传入一个std::initializer_list然后准备一个std::array

c++ initialization c++14

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