我有一个头文件定义一些参数.我已经将一些参数定义为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) #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)
因此我认为默认参数可以解决问题。有什么办法可以实现这一点吗?
malloc()我想在必须是跨平台的 C 程序中使用。但是——它在哪里?我知道 C89 和 C99 语言标准要求它可以通过 获得<stdlib.h>,但是 - 有些平台没有它。我注意到在某些情况下它可能位于<malloc.h>,并且读到它可能位于<malloc/malloc.h>。
我的问题:哪些平台malloc()在哪些地点?具体是我提到的三个地点吗?
注意:请不要建议我使用跨平台开发框架,这与我的情况无关。
通常,如果您使用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) 我正在寻找一种在没有 NVIDIA GPU 的系统上运行 CUDA 程序的方法。
我尝试安装 MCUDA 和 gpuOcelot,但似乎在安装时遇到了一些问题。
我已经完成了如何使用软件实现在没有 GPU 的情况下运行 CUDA 中给出的答案?. 那里的答案建议更改系统硬件,使用模拟器(现已弃用)或切换到 OpenCL。这些都不能充分满足我的要求
我正在尝试找到避免CUDA 内核中线程发散(分支或扭曲发散)的方法。
例如,我有以下条件赋值(a和b是char值,x和y是unsigned 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)来获得适当的整数结果来为每种情况添加(即,1,0或0,1)。
似乎没有常规的int绝对值函数,但我看到的是:
计算| X ?是 | + …
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) CMake 似乎根据文件的扩展名对文件做出了假设——特别是,用什么来编译源文件。虽然这有时可以使用手动编译器标志覆盖(例如,-x C++用于.c文件),这是依赖于特定的编译器和似乎是绕过这个问题。
有没有办法告诉CMake“将带有扩展名的文件.ext1视为具有扩展名.ext2”?我似乎无法在 CMake 文档中找到类似的内容。
我正在执行一些关于移动语义的测试,我的类行为对我来说似乎很奇怪。
鉴于模拟类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) 我想做与这个问题相反的事情:
不知何故,git 决定用 72 个字符包装我的提交消息。我根本不希望它们被包裹……而且我没有做任何事情来启用包裹。
现在,当我已经在编辑提交评论时,我当然可以输入:
:set textwidth&
Run Code Online (Sandbox Code Playgroud)
这将停止包装,但我不想每次都这样做。
附加信息:
:set ft? 说 filetype=gitcommitc++ ×6
c++11 ×3
cuda ×2
c ×1
c++-chrono ×1
cmake ×1
file-type ×1
function ×1
git ×1
gpgpu ×1
gpu ×1
header-files ×1
macros ×1
malloc ×1
shared-ptr ×1
statements ×1
stdvector ×1
text-width ×1
time ×1
unique-ptr ×1
vim ×1
weak-ptr ×1
word-wrap ×1