我在标题中有一个向量,如下所示:
extern std::vector<Foo> g_vector;
Run Code Online (Sandbox Code Playgroud)
在关联的cpp文件中我有这个:
std::vector<Foo> g_vector;
Run Code Online (Sandbox Code Playgroud)
我也有一个类Bar,在它的构造函数中它会添加一些东西g_vector,如下所示:
Bar::Bar(/* stuff */)
{
// do things
std::cout << g_vector.size() << std::endl;
g_vector.push_back(somefoo);
std::cout << g_vector.size() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
如果我声明一个Bar函数内部,就像一个理智的人,它似乎工作正常.但是,如果我想声明Bar一个函数的外部,就会发生奇怪的事情.例如,我Bar在MyFile1.cpp和MyFile2.cpp中声明了一个,并且由于我在Bar中的cout语句,我可以看到Fooget被推入向量,但是当下一个Bar运行它的构造函数时,向量的大小再次为0.换句话说,我的输出是
0
1
0
1
Run Code Online (Sandbox Code Playgroud)
是什么赋予了?为了更加双重确定,我还尝试打印出来&g_vector以确保它实际上push_back是正确的向量,并且地址都匹配.对于它的价值,这些东西在向量中的顺序并不重要.我不关心初始化顺序或任何事情.
我正在用 C++ 编写一个程序,它需要一些命令行参数。我知道在 VSC++ 中传递命令行参数的唯一方法是打开属性并导航到命令行参数字段并输入它们,然后运行它。如果我想每次运行它时传递不同的参数,那么这并不完全简化。
另一种选择是在可执行文件所在的目录中打开命令提示符并从那里的命令行运行它,但是如果我想使用调试器,我必须附加它,这也很痛苦。
有一个更好的方法吗?
假设我有一个函数将函数指针作为参数,该参数有一个默认参数.
template <typename T>
T* default_construct()
{
return new T();
}
template <typename T>
void register(T* (*construct)() = default_construct<T>)
{
// Save that function pointer for later
}
Run Code Online (Sandbox Code Playgroud)
假设我想在我的类上使用register Foo,但是Foo没有默认的构造函数,所以我default_construct不会对它起作用.显而易见的解决方案是做这样的事情:
Foo* construct_Foo()
{
return new Foo("String argument", 123);
}
SomeFunc()
{
// ...
register<Foo>(construct_Foo);
// ...
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用.即使register<Foo>可能只在一个地方调用,并且它传递了一个要使用的函数,default_construct<Foo>仍然会被编译器实例化,并且我得到编译器错误.似乎因为它永远不会被使用,它应该被跳过,但我想情况并非如此.
default_construct当它被用作默认参数时,有什么方法可以防止被实例化?我能想到的唯一解决方案是将它放在模板中,但似乎应该有更好的解决方案.
让我们说我正在调试优化代码中的崩溃.我查看了反汇编,我看到如下内容:
lea eax,[edi+8Ch]
Run Code Online (Sandbox Code Playgroud)
现在让我说我知道在edi中存储了什么结构,在这种情况下它是一个有点大的结构.足够大,我无法一眼就看出8Ch偏移对应的字段.
我一直在做的只是在Visual Studio中打开我的监视窗口,并在一个转换的NULL指针上手动执行指针算法(offsetof macro会做什么),直到我得到匹配的那个,但这很乏味.有没有办法可以更快地确定访问哪个字段?
我有一个用C++编写的项目,我正在使用swig来生成一些C#包装器.C++代码使用Doxygen样式注释来注释类和函数.是否有可能让Swig接受那些doxygen注释并为C#包装器类和函数生成doxygen注释?
...不使用typedef.
我的老板声称他曾经在接受采访时被问过,当他回答时,采访者告诉他他不能使用typedef因为风格很差.
无论如何,他喜欢向人们提出问题只是为了看看他们是否能够做到正确,通常是在新的程序员午餐时间.没有人能做对(特别是没有笔和纸或电脑).我希望下次他试图用它来阻止某人时做好准备>:D
我有一个被调用的基类Component,它有许多派生自它的类.我希望每个类都有一个与之关联的整数(无论哪个组件获得什么值都无关紧要,只要它们从0开始并且是连续的).我不知道如何直接这样做,所以在Component我添加以下文件的同一文件中:
template <typename T>
class ComponentIdentifier
{
public:
static unsigned int cid;
};
static unsigned int CIDCounter = 0;
template <typename T> unsigned int ComponentIdentifier<T> = CIDCounter++;
template <typename T> unsigned int ComponentID()
{
return ComponentIdentifier<T>::cid;
}
unsigned int ComponentCount(); // Defined in .cpp file, just returns CIDCounter
Run Code Online (Sandbox Code Playgroud)
现在我测试了ComponentID()函数,它似乎工作正常.我尝试使用ComponentID的每个组件类都返回了一个不同的整数,就像我预期的那样.但是,每当我调用ComponentCount时,我都会得到0.
例如,如果我有以下代码行:
std::cout << ComponentID<AAA>() << std::endl;
std::cout << ComponentID<BBB>() << std::endl;
std::cout << ComponentID<CCC>() << std::endl;
std::cout << ComponentCount() << std::endl;
Run Code Online (Sandbox Code Playgroud)
然后我的输出是:
0
1
2
0
Run Code Online (Sandbox Code Playgroud)
我怀疑发生的事情是CIDCounter在用于设置每个组件的cid后再次被设置为0,但我不确定并且这看起来有点奇怪.有没有办法做我想做的事情,还是我疯了,整个计划注定要失败?
我正在玩高精度计时器,我的第一个测试之一是使用rdtsc来测量printf.下面是我的测试程序,然后输出.我注意到的是,第一次printf运行时,它在第一次打印时总是比在后续打印时长约25倍.这是为什么?
#include <stdio.h>
#include <stdint.h>
// Sample code grabbed from wikipedia
__inline__ uint64_t rdtsc(void)
{
uint32_t lo, hi;
__asm__ __volatile__ (
"xorl %%eax,%%eax \n cpuid"
::: "%rax", "%rbx", "%rcx", "%rdx");
__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
return (uint64_t)hi << 32 | lo;
}
int main(int argc, const char *argv[])
{
unsigned int i;
uint64_t counter[10];
uint64_t sum = 0;
for (i = 0; i < 10; i++)
{
counter[i] = rdtsc();
printf("Hello, world\n");
counter[i] = rdtsc() - counter[i]; …Run Code Online (Sandbox Code Playgroud) 我觉得我在这里错过了一些非常简单的东西。我想玩一下 clang,所以作为一个起点,我遵循了这个视频中的代码示例,大约 3:40。代码如下:
#include "clang-c/Index.h" // Note: These two lines were
#include <stdio.h> // omitted from the video slides
int main(int argc, char *argv[])
{
CXIndex Index = clang_createIndex(0, 0);
CXTranslationUnit TU = clang_parseTranslationUnit(Index, 0, argv, argc, 0, 0, CXTranslationUnit_None);
for (unsigned I = 0, N = clang_getNumDiagnostics(TU); I != N; ++I)
{
CXDiagnostic Diag = clang_getDiagnostic(TU, I);
CXString String = clang_formatDiagnostic(Diag, clang_defaultDiagnosticDisplayOptions());
fprintf(stderr, "%s\n", clang_getCString(String));
clang_disposeString(String);
}
clang_disposeTranslationUnit(TU);
clang_disposeIndex(Index);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在视频中,他没有声明他省略了这两个#include指令。我想我在上面的例子中正确填写了这些。他还省略了文件的编译和链接方式,这是我遇到问题的部分。按照 …
我有一个使用CMake生成构建脚本的项目,每个平台都会将生成的可执行文件放在不同的位置.我们团队中有一个非程序员,他没有构建工具,我希望能够捆绑运行项目所需的所有文件,脚本和可执行文件,以便他可以运行项目.
为此,我添加了一个自定义目标,它可以获取所有必需的文件并将其压缩.它还会生成一个非常简单的脚本(包含在zip文件中),他只需单击该脚本即可运行脚本然后启动可执行文件,如下所示:
add_custom_target(runcommand
COMMAND echo '\#!/bin/bash -eu' > run.command &&
echo 'cd `dirname $$0`' >> run.command &&
echo './scripts/prerun_script.sh && ${MY_EXECUTABLE}' >> run.command &&
chmod +x run.command)
Run Code Online (Sandbox Code Playgroud)
这个问题是MY_EXECUTABLE是我系统上可执行文件的硬编码路径.我希望它是一个相对路径,这样我就可以获取这个结果zip文件,将其解压缩到任何地方并从那里运行它.我想要的是获取相对于我的项目的根目录的MY_EXECUTABLE路径,以便可以从任何地方运行此脚本.