小编use*_*963的帖子

如果语句包含宏,则clang无法替换语句

我正在使用clang尝试解析(使用C++ API)一些C++文件并使所有case-break对使用特定的样式.

示例:

**Original**

switch(...)
{
   case 1:
   {
      <code>
   }break;

   case 2:
   {
      <code>
      break;
   }
}

**After replacement**

switch(...)
{
   case 1:
   {
      <code>
      break;
   }

   case 2:
   {
      <code>
      break;
   }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,如果代码部分不包含任何宏,我到底做了什么.我的问题是:clang处理扩展(如果我转换一个有问题的语句,它将显示扩展版本)宏是否有所不同?如果是这样我怎么能让它工作?

可能有用的其他信息:

我正在使用Rewriter :: ReplaceStmt用新创建的CompoundStmt替换每个案例的子语句,我注意到如果"from"参数包含一个宏,则replaceStmt返回true,并且该方法返回true的唯一方法是if

Rewriter :: getRangeSize(from-> getSourceRange())

返回-1

c++ clang clang++

20
推荐指数
2
解决办法
2568
查看次数

功能声明后的&符号

我最近遇到了这段代码

T operator () () &
{
...
}

T operator () () &&
{
...
}
Run Code Online (Sandbox Code Playgroud)

而且我很困惑.&和&&在这种情况下意味着什么?这类似于复制和移动构造函数,但是对于函数?

c++ c++11

13
推荐指数
0
解决办法
202
查看次数

默认复制/移动构造函数时GDB中的奇怪行为

我有以下代码似乎在GDB中表现奇怪,具体取决于复制/移动构造函数是否默认.

#include <iostream>

#define CUSTOM 0

class Percentage
{
public:
    using value_t = double;

    Percentage()    = default;
    ~Percentage()   = default;

    template <typename T>
    Percentage(T) = delete;

    Percentage(value_t value):
        m_value(value)
    {}

    #if CUSTOM == 1
    Percentage(const Percentage& p):
        m_value(p.m_value)
    {}

    Percentage& operator=(const Percentage& p)
    {
        m_value = p.m_value;
        return *this;
    }

    Percentage(Percentage&& p):
        m_value(std::move(p.m_value))
    {}

    Percentage& operator=(Percentage&& p)
    {
        m_value = std::move(p.m_value);
        return *this;
    }
    #else
    Percentage(const Percentage&) = default;
    Percentage& operator=(const Percentage&) = default;
    Percentage(Percentage&&) = default;
    Percentage& operator=(Percentage&&) = …
Run Code Online (Sandbox Code Playgroud)

c++ linux gdb

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

使用VS2015进行远程调试

我正在尝试按照如何使用VS调试Linux应用程序的这些步骤.

我遇到的问题是在步骤8,它由VS无法找到命令"Debug.GDBLaunch"组成.

我正在运行VS版本14.0.23107.0 D14REL,我安装了Visual C++ Cross Platform Mobile Development 1.0.

我有什么其他要求,如果没有,问题是什么?

visual-studio-2015

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

调用lambda而不将其绑定到标识符

浏览一些互联网板我遇到了这个小挑战:

"用您喜欢的语言实现递归匿名函数"

显然,使用std :: function/function指针很容易.

我真正感兴趣的是,如果没有将lambda绑定到标识符,这是否可行?

像(忽略明显的无限递归)的东西:

[](){ this(); }();
Run Code Online (Sandbox Code Playgroud)

c++ lambda c++11

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

尽管抓住了一切,为什么"这个"是必要的

任何人都可以向我解释为什么我必须在第二个lambda中明确写出"this->",即使我捕获了一切?

完整性的错误消息:

无法在没有对象的情况下调用成员函数'result_t test :: get()'

#include <iostream>
#include <functional>
#include <algorithm>
#include <vector>

using result_t = std::function<void()>;

struct test
{
    bool noMore = false;

    result_t get()
    {
        return [this]
        {
            std::vector<int> vec;
            vec.push_back(1);
            vec.push_back(2);
            vec.push_back(3);

            if(not noMore)
            {
                noMore = true;

                std::for_each(vec.begin(), vec.end(),
                    [&](const auto& i)
                    {
                        auto value1 = this->get(); // compiles
                        auto value2 = get(); // error
                    });
            }
        };
    }
};

int main() {
    test t;
    t.get()();
}
Run Code Online (Sandbox Code Playgroud)

Godbolt

c++ c++14

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

"美化"宏观

观看Herb Sutter关于C++及其他原子的讨论我瞥见了他的一个易于使用的锁定/解锁机制的想法,该机制可能会或可能不会出现在该语言的未来标准中.

该机制看起来像:

atomic{
// code here
}
Run Code Online (Sandbox Code Playgroud)

我不想等待未来的标准我自己试图实现这个,我想出的是:

#define CONCAT_IMPL(A, B) A ## B
#define CONCAT(A, B) CONCAT_IMPL(A, B)

# define atomic(a) { \
static_assert(std::is_same<decltype(a), std::mutex>::value,"Argument must be of type std::mutex !");\
struct CONCAT(atomic_impl_, __LINE__)\
{\
std::function<void()> func;\
std::mutex* impl;\
CONCAT(atomic_impl_, __LINE__)(std::mutex& b)\
{ \
    impl = &b;\
    impl->lock();\
}\
CONCAT(~atomic_impl_, __LINE__)()\
{ \
    func();\
    impl->unlock(); \
}\
} CONCAT(atomic_impl_var_, __LINE__)(a);\
CONCAT(atomic_impl_var_, __LINE__).func = [&]()
Run Code Online (Sandbox Code Playgroud)

和用法:

std::mutex mut;
atomic(mut){
    // code here
};}
Run Code Online (Sandbox Code Playgroud)

问题显然是}; 我想删除.

这有可能吗?

c++ macros c++11

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

从QTextEdit中删除最后一行

我正在使用这段代码尝试从QTextEdit中删除最后一行:

    ui->textEdit_2->textCursor().setPosition( QTextCursor::End);
    auto k = ui->textEdit_2->textCursor().currentTable();
    k->removeRows(k->rows() - 1, 1);
Run Code Online (Sandbox Code Playgroud)

但是我遇到了分段错误.调试后,我发现当调用removeRows时,k为null.

难道我做错了什么?如果是的话,怎么解决?

c++ qt

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

DirectWrite文本位置因字体大小而异

我正在使用DirectWrite将一些文本呈现到窗口.除了使用不同字体大小的定位外,一切似乎都有效:我希望有两个字体大小为v1和v2的文本以及两个带有(x,y)=(0,0)的文本位于左上角,但正如您所见:

在此输入图像描述

"测试"和"X"都不在左上方.

有没有办法让这项工作?

c++ winapi directwrite

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

为什么我们不能将函数显式化?

为什么我们不能在函数上使用explicit关键字?我想不出有一个很好的理由不允许这个(和几个相反).

为什么是这样?

c++ keyword

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

标签 统计

c++ ×9

c++11 ×3

c++14 ×1

clang ×1

clang++ ×1

directwrite ×1

gdb ×1

keyword ×1

lambda ×1

linux ×1

macros ×1

qt ×1

visual-studio-2015 ×1

winapi ×1