小编Dar*_*bik的帖子

使用Clang将C++转换为C代码

我知道llvm可以用来将c ++转换成c代码.我想知道是否clang可以做同样的事情(看来clang是从中衍生出来的llvm).

那么我可以用clangc ++代码转换成c代码吗?

如果你想知道我为什么要这样做,这是我的场景:

PIC是一家微控制器制造商,它不生产c ++编译器,但确实为其大多数产品制作了c编译器.我想用c ++编写,然后作为构建过程的一部分,将c ++代码转换为临时c文件,然后将其输入PIC编译器,并且我已经为PIC micro编写了c ++代码.

c c++ frontend llvm clang

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

将constexpr数组复制到类中

假设我有一个班级:

class MyClass{
  char array[12];
  public:
  MyClass(const char* arr) {
    for (int x = 0; x < 12; x++){
      array[x] = arr[x];
    }
  }
};
Run Code Online (Sandbox Code Playgroud)

是否可以制作MyClass构造函数constexpr.棘手的部分是初始化新阵列....

c++ arrays constructor constexpr c++11

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

重新分配虚拟功能是合法的

假设我有一个这样的类:

struct A{
  virtual void someFunc() { }
};
Run Code Online (Sandbox Code Playgroud)

是否可以将虚函数重新分配给另一个函数....这可能是可能的,因为它基本上将一个函数指针存储在类中,以便它可以virtual.

我意识到这样的事情:

void aRandomFunc();
A mya;
mya.someFunc = &aRandomFunc;
Run Code Online (Sandbox Code Playgroud)

可能是不可能的,因为成员函数将this指针作为隐式参数.

但是有可能将成员函数重新分配给另一个成员函数吗?

c++ virtual inheritance function-pointers

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

为什么&&有时绑定左值而不是其他时间?

好的,我有这个代码:

struct Mine{
    template<typename T>
    Mine(T&& x){
    }
};
void nFoo(int&& x){
}
void sFoo(Mine x){
}
Run Code Online (Sandbox Code Playgroud)

将nFoo需要一个int&&直接,而sFoo做一些finagling来获得同样的效果.

考虑以下代码:

nFoo(12); //Works

int x = 0;
nFoo(x);  //Cannot bind int (lvalue) to int&&

sFoo(12); //Works
sFoo(x);  //Works
Run Code Online (Sandbox Code Playgroud)

为什么int&&有时允许从lvalues 绑定,有时不允许绑定?

c++ rvalue lvalue rvalue-reference

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

clang的优化是否被打破了?

如果我将这个c ++程序插入clang(版本3.7)

///*
#include "stdio.h"
#include "stdint.h"
//extern int printf(const unsigned char*, ...);


extern "C" void __cxa_pure_virtual() { }

struct A
{
    virtual void foo() = 0;
};

struct B : A
{
    uint32_t x;
    B(int x) : x(x) { }
    virtual void foo()
    {
        printf("This is a test %d\n", x);
    }
};
//*/
uint64_t thing = 0;
float other = 10.0f;
B b(12345);
int main()
{

    thing++;
    A* a = &b;
    other *= 3.14159f;
    a->foo();
}
Run Code Online (Sandbox Code Playgroud)

并编译 …

c++ optimization llvm clang

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

在微控制器上用C++调整动态数组的大小是个好主意

我正在构建一个模型铁路道口信号,正在研究微控制器代码以使其正常工作.我遇到了一个让我质疑我的方法论的问题.

我正在阅读RFID标签(每辆车内都有一个),一旦列车触发进入过道门区域,并将标签号码放入一个阵列中.问题是阵列很可能总是需要重新调整大小,因为不是每辆列车都有相同数量的汽车,因此RFID标签的数量相同.我需要捕获最后一个汽车标签,因为我需要从出口区RFID阅读器监控该标签,所以我知道何时关闭大门并关闭闪光灯.此外,我可以计算汽车,因为发现了新标签,并且刚刚匹配出口区域中的计数,因此不需要阵列.

除了和数组之外还有更有效的方法吗?我是一个C#家伙,所以不熟悉如何在C++中处理,使用指针和随附的所有内容.

另一个想法是放弃数组,只需更换每个标签的标签识别变量阅读,思考过去的汽车标签将在变量所有的时间,并匹配入口和出口的汽车数量,这可能是最简单的解决方案.

关于最佳方法的想法?

c++ arrays

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

PDP 字节序和位移位

当您在 PDP 字节序中进行位移时,此操作是否比在小字节序或大字节序系统上花费的时间稍长一些?

我问这个问题的原因是因为对于计算机来说,似乎很难在一个班次中向各个方向传输位。

我无法以任何方式测试这一点,因为我无法访问 PDP 字节序机器。=(

assembly bit-manipulation endianness

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

操作员新回复的内存比要求的多

我想覆盖运算符new以获得此签名:

void* operator new(size_t bytes, MemoryManager* man);
Run Code Online (Sandbox Code Playgroud)

这堂课MemoryManager看起来像这样:

struct MemoryManager
{
  virtual void* Allocate(size_t bytes) = 0;
  virtual void Deallocate(void* ptr) = 0;
};
Run Code Online (Sandbox Code Playgroud)

现在我想做的是让重载new函数分配比要求更多的内存.然后在最后几个字节中它将存储一个指向该MemoryManager对象的指针,以便它知道在我的自定义delete运算符中使用什么函数.所以看起来像这样分配:

 __________
|          |   _
|__________|    |
|          |    |
|__________|    |
|          |    | <---- Bytes requested for object
|__________|    |
|          |    |
|__________|    |
|          |   _|
|__________|   
|          |   _ 
|__________|    | <---- Pointer to MemoryManager
|          |   _|
|__________|   
Run Code Online (Sandbox Code Playgroud)

现在我真正的问题是:这样做会导致未定义的行为吗?一些可能有问题的事情:

  • new …

c++ new-operator undefined-behavior language-lawyer

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

为什么不能boost :: hana :: overload_t成为类的成员

所以我有几个函数,我得到一个神奇的函数对象,它提供了重载解析:

void foo1();
void foo2(int);


auto foo_ptr = boost::hana::overload(foo1,foo2);
//Later
foo_ptr(12);  //Both Valid (Yeah!)
foo_ptr();
Run Code Online (Sandbox Code Playgroud)

但是,当我做这样的事情时,问题出现了:

using ptr_t = decltype(foo_ptr);

struct mine
{
    ptr_t ptr;
    mine(ptr_t ptr) : ptr(ptr){}
};


mine m(foo_ptr);
Run Code Online (Sandbox Code Playgroud)

当我尝试编译这段代码时,我得到了error: no matching function for call to 'boost::hana::overload_t<void (*)(int)>::overload_t()'.

看看Godbolt .....

现在我的问题是:

我是否允许复制这些重载对象(hana的文档没有说明这种或那种方式),如果是这样的话,为什么当我把它作为成员放在一个类中时它会失败?

c++ overloading c++14 boost-hana

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

我可以隐式创建一个可复制的类型吗

我的问题是这样的:

假设类型T是可复制的。...可以在不调用构造函数的情况下“创建”该类型的实例。

#include <type_traits>
#include <cstring>

using T = int; // T can be any trivially copyable type


T create(const T& other)
{
    std::aligned_storage_t<sizeof(T),alignof(T)> my_T;

    std::memcpy(&my_T,&other,sizeof(T));

    return *reinterpret_cast<T*>(&my_T);
}
Run Code Online (Sandbox Code Playgroud)

这是已定义的行为,还是只能复制到T类型的现有对象中?

c++ copy memcpy language-lawyer c++14

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

一元 - 和n之间有区别吗?

我相当肯定uint8_t从另一个中减去一个应该导致另一个无符号数,但我的一些结果让我感到困惑.

  uint8_t a = 2;
  uint8_t b = 1;
  uint8_t c = -a;
  long d = b - a;
  long e = b + c;
Run Code Online (Sandbox Code Playgroud)

当我获得d它产生的价值时-1,e正如我所期望的那样255.这是gcc我正在使用的版本的错误.....对吗?

作为参考,我正在使用arm-none-eabi-g++编译器MSP-432.

看着这似乎表明gcc这里似乎犯了同样的错误.

看看这个问题似乎看起来像神弩和手臂gcc是错误的.

这里发生了什么?

c++ gcc compiler-bug unsigned-integer

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

!=和=之间的区别!举个例子(用C++编写)

c ++中的操作!=和=!操作有什么区别?

我试着谷歌搜索答案,但似乎搜索引擎不接受一些文本,如!=或=!

我也知道差异的逻辑是什么,但我想不出一个实际的例子.我的意思是假设我有两个参数A和B在什么条件下A =!B将是真的但A!= B将是假的

if(A!=B) return true;
if(A=!B) return false;
Run Code Online (Sandbox Code Playgroud)

我真的找不到任何搜索引擎的答案,似乎在任何文档中都没有提到.

c++

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

一个基础来统治它们.将它们全部带入黑暗中的一个基础束缚它们

是否有可能编写一个通用基类,所有其他类(除了它)公开并实际上继承?(gcc有解决方法吗?).最好不要明确地继承...因为我希望标准库的东西也从这里继承....这是明智的做法吗?

如果你投票,请解释原因(我相信这是一个合法的问题,即使它是一个愚蠢的事情,它可能是,但这是问题的一部分)

c++ inheritance gcc

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