小编ein*_*ica的帖子

C++未知名称类型

我有一个头文件定义一些参数.我已经将一些参数定义为extern.我的程序适用于其他数据类型,如double和int,除非我尝试添加矢量变量.头文件中的声明是

extern std::vector<double> my_vec;
Run Code Online (Sandbox Code Playgroud)

在我的主文件中,我使用以下代码构建向量:

std::vector<double> my_vec(3,0);
Run Code Online (Sandbox Code Playgroud)

当我尝试使用clear方法清除向量时,编译器会给出一个错误说明未知类型.我甚至不确定如何调试这个.有人可以帮忙吗?

PS我原本试图使用以下方法为此向量分配一些值:

my_vec[0] = 1;
Run Code Online (Sandbox Code Playgroud)

但是编译器说C++需要所有声明的类型说明符.我用Google搜索了这个错误,但我不明白,因为我指定了my_vec的类型.

编辑:示例:

main.cpp
#include "params.h"
#include <vector>

std::vector<double> my_vec(3,0);

my_vec.clear();
// edit: my_vec[0] = 1; this also produces an error

int main(){
    return 0;
}

params.h
#include <vector>

extern std::vector<double> my_vec;
Run Code Online (Sandbox Code Playgroud)

错误信息:

main.cpp:6:1: error: unknown type name 'my_vec'
my_vec.clear();
^
main.cpp:6:7: error: cannot use dot operator on a type
my_vec.clear();
      ^
2 errors generated.
Run Code Online (Sandbox Code Playgroud)

c++ function global-variables statements

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

是否可以使作为默认参数的宏在调用站点扩展?

#include <stdio.h>

void print(int a = __LINE__){printf("hello %d\n", a);}

void main(){
  print();
  print();
  print();
  print();
}
Run Code Online (Sandbox Code Playgroud)

本例中的宏__LINE__扩展为 3,因此使用相同的值调用 print 函数 4 次。有没有办法说服编译器在调用点扩展此宏,以便使用 C++11 中存在的功能6,7,8,9而不是调用 print 函数?3,3,3,3

我的用例:

在我的应用程序中,我提供了多个采用唯一 ID 的函数。每个调用站点/位置的 ID 应该是唯一的(因此,如果通过同一语句调用该函数两次,它应该收到相同的 id)。目前,用户始终必须LOCATION在调用站点手动键入宏,如下所示:

#define S1(x) #x //voodoo to concat __FILE__ and __LINE__
#define S2(x) S1(x)
#define LOCATION __FILE__ S2(__LINE__)

do_stuff1(arguments, LOCATION)
do_stuff2(arguments, LOCATION)
Run Code Online (Sandbox Code Playgroud)

如果我可以节省他们的打字时间,而不需要为每个函数创建宏,如下所示,那就更方便了:

#define do_stuff1(do_stuff1_imp(arguments, LOCATION))
#define do_stuff2(do_stuff2_imp(arguments, LOCATION))
Run Code Online (Sandbox Code Playgroud)

因此我认为默认参数可以解决问题。有什么办法可以实现这一点吗?

c++ macros default-arguments c++11 std-source-location

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

哪个标头在哪个平台上定义了 malloc()?

malloc()我想在必须是跨平台的 C 程序中使用。但是——它在哪里?我知道 C89 和 C99 语言标准要求它可以通过 获得<stdlib.h>,但是 - 有些平台没有它。我注意到在某些情况下它可能位于<malloc.h>,并且读到它可能位于<malloc/malloc.h>

我的问题:哪些平台malloc()在哪些地点?具体是我提到的三个地点吗?

注意:请不要建议我使用跨平台开发框架,这与我的情况无关。

c malloc multiplatform header-files

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

指代您不拥有的“ std :: unique_ptr”(使用原始指针?)

通常,如果您使用a std::shared_ptr指向对象,并且要创建另一个指向该对象的不共享所有权的指针,则会创建一个std::weak_ptr

// Create a shared pointer to own the object
std::shared_ptr<int> p = std::make_shared<int>(42);

// Create a weak pointer (that does not own the object)
std::weak_ptr<int> q(p);

// Use the weak pointer some time later
if (std::shared_ptr ptr = q.lock()) {
  // use *ptr
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,涉及到该如何处理std::unique_ptr

使用唯一指针可确保当前资源由其std::unique_ptr自身专有。但是,如果我想创建一个指向不拥有该资源的资源的指针,该怎么办?我不能使用a,std::weak_ptr因为弱指针旨在与的引用计数一起使用std::shared_ptr。我会在这里使用原始指针吗?还是有更好的选择?

// Create a unique pointer to own the object
std::unique_ptr<int> p = std::make_unique<int>(42);

// Create a non-owning pointer to the same …
Run Code Online (Sandbox Code Playgroud)

c++ shared-ptr weak-ptr unique-ptr c++11

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

我可以将 CUDA 与非 NVIDIA GPU 一起使用吗?

我正在寻找一种在没有 NVIDIA GPU 的系统上运行 CUDA 程序的方法。

我尝试安装 MCUDA 和 gpuOcelot,但似乎在安装时遇到了一些问题。

我已经完成了如何使用软件实现没有 GPU 的情况下运行 CUDA 中给出的答案. 那里的答案建议更改系统硬件,使用模拟器(现已弃用)或切换到 OpenCL。这些都不能充分满足我的要求

cuda gpu gpgpu

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

使用条件分配避免 CUDA 内核中的线程发散

我正在尝试找到避免CUDA 内核中线程发散分支扭曲发散)的方法。

例如,我有以下条件赋值(abchar值,xyunsigned int值):

if (a == b) { ++x; }
else        { ++y; }
Run Code Online (Sandbox Code Playgroud)

或者,或者:

if (a == b) { ++x; }
if (a != b) { ++y; }
Run Code Online (Sandbox Code Playgroud)

如何重写上述操作以避免分支?

我查看了类型转换内在函数,但没有从boolto转换可用int。我在想可能有一些技巧可以使用min,max和绝对值(例如,__sad)来获得适当的整数结果来为每种情况添加(即,1001)。

似乎没有常规的int绝对值函数,但我看到的是:

计算| X ?是 | + …

cuda

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

How to run a loop for a specified amount of time

I would like to run a piece of code for a specified amount of time. This does not seem to work. Why?

int sec = 5;
auto start = std::chrono::steady_clock::now();
while (std::chrono::duration<double, std::milli>(
          start - std::chrono::steady_clock::now()
       ).count() < sec * 1000)
{
    // do stuff
};
Run Code Online (Sandbox Code Playgroud)

c++ time c++-chrono

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

如何在 CMake 中“覆盖”文件的扩展类型

CMake 似乎根据文件的扩展名对文件做出了假设——特别是,用什么来编译源文件。虽然这有时可以使用手动编译器标志覆盖(例如,-x C++用于.c文件),这是依赖于特定的编译器和似乎是绕过这个问题。

有没有办法告诉CMake“将带有扩展名的文件.ext1视为具有扩展名.ext2”?我似乎无法在 CMake 文档中找到类似的内容。

c++ file-extension file-type cmake

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

为什么我的数据元素被复制而不是移动?

我正在执行一些关于移动语义的测试,我的类行为对我来说似乎很奇怪。

鉴于模拟类VecOfInt

class VecOfInt {
public:
    VecOfInt(size_t num) : m_size(num), m_data(new int[m_size]) {}
    ~VecOfInt() { delete[] m_data; }
    VecOfInt(VecOfInt const& other) : m_size(other.m_size),  m_data(new int[m_size]) {
        std::cout << "copy..." <<std::endl;
        std::copy(other.m_data, other.m_data + m_size, m_data);
    }
    VecOfInt(VecOfInt&& other) : m_size(other.m_size) {
        std::cout << "move..." << std::endl;
        m_data = other.m_data;
        other.m_data = nullptr;
    }
    VecOfInt& operator=(VecOfInt const& other) {
        std::cout << "copy assignment..." << std::endl;
        m_size = other.m_size;
        delete m_data;
        m_data = nullptr;
        m_data = new int[m_size];
        m_data …
Run Code Online (Sandbox Code Playgroud)

c++ stdvector move-constructor move-semantics c++11

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

在vim中编辑git提交消息时防止自动换行

我想做与这个问题相反的事情:

在 Vim 中自动包装很长的 Git 提交消息

不知何故,git 决定用 72 个字符包装我的提交消息。我根本不希望它们被包裹……而且我没有做任何事情来启用包裹。

现在,当我已经在编辑提交评论时,我当然可以输入:

:set textwidth&
Run Code Online (Sandbox Code Playgroud)

这将停止包装,但我不想每次都这样做。

附加信息:

  • 我正在使用 Devuan GNU/Linux 3 (~= Debian 10)。
  • :set ft?filetype=gitcommit
  • 当我刚启动 vim 或使用 vim 编辑任何现有文件时,不会发生换行。

git vim word-wrap text-width

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