小编Xaq*_*aqq的帖子

为什么这不是POD?

这是关于std::is_pod,它检测模板是否是普通旧数据类型.

请参阅以下代码:

struct A {
public:
    int m1;
    int m2;
};

struct B {
public:
    int m1;
private:
    int m2;
};

struct C {
private:
    int m1;
    int m2;
};

int main()
{
    std::cout << std::boolalpha;
    std::cout << std::is_pod<A>::value << '\n'; // true
    std::cout << std::is_pod<B>::value << '\n'; // false
    std::cout << std::is_pod<C>::value << '\n'; // true
}
Run Code Online (Sandbox Code Playgroud)

这3个结构对我来说都像POD.但显然struct B不是.我不明白为什么.对我来说,他们都有一个简单的构造函数,移动和复制操作符.析构函数当然也是微不足道的.

我责备它使用2访问说明符,但我找不到有关此信息.

c++ data-structures

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

'is_trivially_copyable'不是'std'的成员

我的gcc版本是4.8.3 20140624.我可以使用is_pod,is_trivial,is_standard_layout,但尝试失败时is_trivially_copyable,is_constructibleis_default_constructible,也许更多.错误消息是'xxx' is not a member of 'std'.

这有什么问题?它们甚至得到当前海湾合作委员会的支持吗?谢谢!

c++ type-traits c++11

16
推荐指数
4
解决办法
8280
查看次数

程序出口处的printf flush

我很想知道printf()当程序退出时函数的flush 如何工作.

我们来看下面的代码:

int main(int ac, char **av)
{
    printf("Hi");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如何printf()管理将其缓冲区刷新到stdout

我想这是平台依赖的,所以让我们采取Linux.

它可以使用gcc's 实现,__attribute__((dtor))但标准库将依赖于编译器.我认为这不是它的工作方式.

任何解释或文档链接表示赞赏.谢谢.

c linux printf

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

直接从堆栈获取变量参数

我正在玩堆栈和函数的调用参数.我想在这里实现的是直接使用堆栈获取变量参数的值.

当我不使用变量参数时,它工作(或似乎工作)很好.这是什么工作:

void test(int a, int b)
{
  unsigned char *ptr;
  int i;

  ptr = (unsigned char*)&a;
  for (i = 0; i < 4; i++)
    {
      printf("%d,", *ptr);
    }    
}
Run Code Online (Sandbox Code Playgroud)

这有效,我可以检索b的值; 使用相同的代码

void test(int a, ...);
Run Code Online (Sandbox Code Playgroud)

因为函数的原型不起作用.

我不明白这里发生了什么.

你能帮助我吗?谢谢 !

编辑:好的,然后它看起来没有稳定可靠的方式来做我自己的那种东西.让我们说在callee函数中我知道变量参数的数据大小(但不是类型),有没有办法抓住它们?

c

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

QSql模块和多线程应用程序

我对Qt模块如何在Qt中使用多线程应用程序感到困扰. http://doc.qt.io/qt-5/threads-modules.html#threads-and-the-sql-module明确指出"只能在创建连接的线程中使用连接".

但是我写的这段代码有效:

#include <QCoreApplication>
#include <QSqlQuery>
#include <QtConcurrentRun>

void    req()
{
  QSqlQuery q("INSERT INTO users (username) VALUES (\"test\")");
}

void    db()
{
  QSqlDatabase _db;

  _db = QSqlDatabase::addDatabase("QMYSQL");
  _db.setDatabaseName("dbname");
  _db.setHostName("host");
  _db.setUserName("username");
  _db.setPassword("password");
  if (_db.open())
    std::cout << "Ok" << std::endl;
  else
    std::cout << "Error" << std::endl;
}

int     main(int ac, char **av)
{
  QCoreApplication app(ac, av);
  QtConcurrent::run(db);
  sleep(1);
  QtConcurrent::run(req);
  return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

我的应用程序设计需要多个线程与数据库交互.线程由QtConcurrent :: run()生成和管理.

那么,既然这段代码可以用,或者我会遇到麻烦吗?

欢迎任何帮助,文档或解释!谢谢.

c++ qt multithreading qtsql

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

变异模板提取

我遇到了一些我无法理解的东西,也找不到适当的解决方法.我想要实现的目标看起来相对简单:我想比较一些数据.

描述的最佳方式是一行代码:

std::tuple<const char *, int, const char *, int> my_data =
    std::make_tuple("hello", 13, "world", 37);
// Now I want to compare my_data againt some known value.
assert(Test::entry(my_data, "hello", 13, "world", 37));
Run Code Online (Sandbox Code Playgroud)

为了这个例子我正在使用一个元组.我的情况是,这些数据来自消息对象并使用提取operator>>.但是,这与问题无关.

这是一个简单的代码来说明问题.

#include <cstring>
using MyTuple = std::tuple<const char *, int, const char *, int>;

namespace Test
{

  // called when we are done                                                                                                                                                                 
  bool extract(MyTuple source)
  {
    return true;
  }

  template<typename T,
           typename ...Content>
  bool extract(MyTuple source, T data, Content... content)
  {
    if (std::is_same<const char …
Run Code Online (Sandbox Code Playgroud)

c++ templates variadic-templates c++11

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

运算符[]的正确输入数据类型是什么?

访问数组时,我们使用运算符,[]如下所示:

int a[5];
...
a[b] = 12;
Run Code Online (Sandbox Code Playgroud)

b上面变量的正确数据类型是什么?

我发现这a[b]相当于*(a + b),这让我觉得我想b成为void*或者size_t但是,我不确定.

c memory arrays

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

OpenMP原子内存顺序

我开始学习OpenMP并发现了该#pragma omp atomic指令.

我对C++ 11的原子有基本的了解,并且知道你可以将memory_order参数传递给atomics的方法.如果我错了,请纠正我,但我认为如果使用memory_order_seq_cst例如,这允许使用原子作为同步点.

一些限制较少的内存顺序,比如memory_order_relaxed确保原子上的操作同步并且对其他人可见.它对其他内存更新没有任何帮助.

我想知道OpenMP的原子指令使用了什么内存顺序.它只会同步对原子的访问,还是作为内存同步的点?

我的猜测是,它更像是memory_order_relaxed,因为critical这里提供完全同步.

我欢迎任何好的解释/信息.谢谢.

c++ atomic openmp c++11

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

吸气剂设定器中的互斥体

我想知道如何将mutex用于多线程应用程序.我的吸气剂是否也需要锁定?我找到了这篇文章.答案是肯定的,我需要保护getter函数,但这意味着我将能够一次执行一次读取,并且我想知道它是否可以改进.

TED的回答表明,如果setter的函数没有锁定互斥锁来执行写操作,那么你可以通过多线程可以同时读取数据的方式实现锁.我试图找到一些例子 - 阅读Qt的文档 - tought,QMutex没有isLocked()函数或类似的东西.那么你如何能够巧妙地实现这种"智能锁".

谢谢

c++ qt

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

"extern"关键字用法

我有以下代码片段:

 #include<iostream>

 int main()
 {
     extern int a;
     printf("a = %d", a)
 }
 int a = 10;
Run Code Online (Sandbox Code Playgroud)

上面的示例代码打印10.我的猜测是应该打印垃圾值.有人可以解释一下吗?

c++ extern

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

关于在C中使用存储类

如果函数的参数的int *check(register int,register int);存储类声明为其他存储类,则以下代码显示错误.

我使用GNU GCC CompilerCode :: Blocks 10.05 IDE上编译了这段代码.错误背后的原因是什么?它是编译器特定的错误还是一般错误?代码部分从这里开始:

int *check(register int, register int);

int main()
{
  int *c;
  c = check(10, 20);
  printf("%d\n", c);
  return 0;
}

int *check(register int i,register int j)
{
  int *p = i;
  int *q = j;
  if(i >= 45)
    return (p);
  else
    return (q);
}
Run Code Online (Sandbox Code Playgroud)

c

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