标签: C++
Dll
visual-studio-2005precompiled-headers
当此解决方案使用.lib文件而不是.dll文件时,此操作不会出错
除了一个当前使用预编译头的项目外,我的所有项目都没有错误。预编译头称为“LudoGlobal.h”。我试图将上一个项目链接到这个预编译头(它存在于一个单独的“核心”项目中),但我得到了以下错误:
错误4致命错误C1083:无法打开
预编译头文件:
“....\Output\LudoSound\Debug\LudoSound.pch”:
没有此类文件或文件
目录ludosundmanager.cpp 1
对于每个.cpp文件。为什么
如果默认参数值是动态绑定的,那么编译器必须找到一种方法,在运行时为虚拟函数的参数确定适当的默认值,这将比当前在编译期间确定它们的机制更慢、更复杂
有人能再详细一点吗?为什么它既复杂又低效
非常感谢 因为对于函数调用,需要使用与对象实例关联的vtables查找实际调用,并且需要以某种方式推断出结果。这意味着ctable需要扩展,或者需要额外的管理才能将默认值链接到vtable条目。每当类具有虚拟函数时,编译器都会生成一个所谓的v-table来计算运行时支持动态绑定和多态行为所需的正确地址。许多类优
但它会阻止我的应用程序显示对话框。我不知道是否有任何方法或其他方式来做这件事
谢谢您需要调用CDialog::Create。完成对话框后,您需要调用destronWindow。您可能还需要将对话框消息传递到对象上,但我不记得MFC是否为您处理此问题。使用CDialog::Create,然后使用CDialog::ShowWindow。您现在有了一个无模式对话框。DoModal正在阻塞。您必须在堆上创建对话框或使其成为类的成员(这一点很重要),然后调用create然后调用ShowWindow。您可以
通常,使用排序的std::vector比使用std::set更有效。有人知道一个库类sorted_vector,它基本上与std::set有一个类似的接口,但是它将元素插入到排序的向量中(这样就不会有重复项),使用二进制搜索来查找元素,等等
我知道写起来并不难,但最好还是不要浪费时间使用现有的实现
更新:使用排序向量而不是集合的原因是:如果有成千上万个小集合,每个集合只包含10个左右的成员,只使用排序向量更节省内存。我认为STL中没有“排序容器”适配器,因为已经有了适当的关联容器来保持事物的排序
为什么它不起作用
---boost_bind.cc---
#包括
#包括
#包括
无效函数1(常量int&i)
{ }
void func2(常量::asio::错误代码&e)
{ }
int main()
{
::boost::function f1=::boost::bind(&func1,1);
//它不起作用!
::boost::function f2=::boost::bind(&func2,::asio::占位符::错误);
返回0;
}
这就是错误:
while_true@loc
C++有时会有非常复杂的语法,这让我在尝试使用OGRE3D时有点困惑,例如…引用是自动完成的,比指针安全得多,标准库要广泛得多,模板使代码非常可定制,并且大大加快了速度和安全性。C++提供了奇妙的代码使用/重用和组织。另外,如果你不太依赖OOP,那么你就做错了。有时对象不合适,但它们不是大多数场景。 < P>非OO特征,即C++没有C:/P>
模板
函数重载
参考资料
名称空间
您可以使用structs和enums,而无需在每次声明之前写入struct或enum,也无需使用typedefs
即使
标签: C++
C
headerforward-declaration
当我在头文件中声明一个函数,并将该函数的定义放在其他文件中时,编译器/链接器如何找到该定义?它是系统地搜索路径中的每个文件,还是有更优雅的解决方案?这几天来一直困扰着我,我一直找不到解释。编译器不这么做,链接器这么做
当编译器一次处理一个源文件时,当调用链接器时,它会被传递编译器生成的所有目标文件的名称,以及用户希望链接到的任何库的名称。因此,链接器完全了解可能包含定义的文件集,只需查看这些对象文件的符号表即可。除此之外,它不需要进行任何搜索
例如,假设您有foo.h和foo.c定义和实现函数f
我知道,下面还有一些类似的问题,但我找不到一个具体的答案来帮助我。所以我的问题是:
我在一个应用程序上工作,该应用程序在启动时进行一些gui初始化。我必须做的事情之一就是打电话
NetworkConfigurationManager::updateConfigurations ()
这是一个异步调用,完成后会发出updateCompleted()信号。问题是,我的所有其他gui初始化都必须等待updateConfigurations()完成
所以我能做的就是这样:
MyApp::MyApp(Q
我似乎不能把一个论点传给别人。如果我不传递参数,函数将正常运行。如果我传递一个参数(整数),编译时会出现错误“没有这样的名称类型”和“没有这样的插槽”
在我的标题中,我声明:
private slots:
void addButton(int);
signals:
void clicked(int)
在my Main.cpp中,我执行以下操作:
int count;
int count = 0;
QPushButton* button = new QPushButton("Button");
考虑给定的代码
struct ABC
{
ABC()
{
std::cout<<" Calling from default constructor";
}
ABC(const ABC ©)
{
std::cout<<"Calling from copy constructor";
}
};
int main()
{
ABC abc = ABC();
}
结构AB
我最近读了很多关于Linux上共享库的文章,下面是我学到的:
共享库应嵌入soname,包括其主要版本号。类似于:libfoo.so.1
它的真实文件名还应该包含一个次要版本号。类似于:libfoo.so.1.0
当库文件被复制到,比如说/usr/local/lib,如果运行ldconfig,它将读取soname,并创建一个名为libfoo.so.1的符号链接,指向libfoo.so.1.0
如果要使用此库进行开发,应首先创建一个符号链接,该符号链接不带任何版本号,指向实际文件,例如libfo
这有可能吗?我希望它能够在编译时传递参数。假设这只是为了方便用户,因为人们总是可以使用模板键入真正的类型,但对于某些类型,即指向成员函数的指针,即使使用decltype作为快捷方式,这也相当繁琐。考虑下面的代码:
struct Foo{
template<class T, T X>
void bar(){
// do something with X, compile-time passed
}
};
struct Baz{
void bang(){
}
标签: C++
structuredeep-copy
这可能是一个非常基本的问题,但不知何故它让我上当了。。。当我编写测试代码时,它似乎可以工作,但在生产中出现了一些问题
// Header file
#define length 100
typedef struct testStr_t {
int a;
char b;
char t1[length];
char t2[length];
} test;
void populateTest(test*);
// source file
test test1;
te
标签: C++
Qt
sftpqnetworkaccessmanager
我是Qt新手,我想为我的软件实现FTP和SFTP支持。
当我在谷歌上搜索时,我发现不存在用于Qt的sftp库,但使用QNetworkAccessManager应该是可能的。
然后我试图发现如何构建自定义协议或类似的东西,但没有找到如何实现它的方法
有人知道我是怎么做到的吗
谢谢,
Michael每个协议都需要一个自定义实现。但是我们可以创建一个像QHttp这样的类来实现这一点。有几种协议具有相似的语义,但并非全部。因此,如果您想编写它,请告诉我,我会帮助您。Qt SDK中不支持SFTP,但Qt
标签: C++
fstreamrelative-path
我是否总是必须为从std::fstream类实例化的对象指定绝对路径?换句话说,有没有一种方法可以指定它们的相对路径,比如项目路径 您也可以使用相对路径。但它们与调用可执行文件的环境有关
这取决于操作系统,但所有主要系统的行为或多或少都是相同的
Windows示例:
// File structure:
c:\folder\myprogram.exe
c:\myfile.txt
// Calling command from folder
c:\folder > myprogram.ex
考虑以下代码沿3个文件展开:
// secret.h
#pragma once
class Secret { /* ... */ };
// foo.h
#pragma once
#include "secret.h"
template <typename T>
class Foo {
public:
// Other members ...
void bar();
};
/* Definition is included inside 'foo.h' becau
标签: C++
atlwindows-shellshell-extensions
这似乎是一个常见的问题,但在做了一些搜索之后,我真的无法找到我的答案。这里有一篇关于这方面的文章:
但这是一个非常旧版本的VisualStudio。我使用的是VS2008,所以指令和接口似乎与我看到的不匹配
< >我想用C++创建一个简单的shell扩展,它为扩展的文件创建上下文菜单。当右键单击这些文件时,我应该能够单击上下文菜单项,并在代码中进行回调,以便对该文件执行某种操作
其他上下文菜单项将执行一些操作,如生成无模式对话框,以在执行某些操作之前接受用户输入
据我所见,ATL用于此目的,但
假设我正在为一个二叉树创建一个类,BT,我有一个类描述树的一个元素,BE,类似
template<class T> class BE {
T *data;
BE *l, *r;
public:
...
template<class U> friend class BT;
};
template<class T> class BT {
BE<T> *root;
public:
...
private:
...
};
头文件经过预处理,预处理器甚至不关心头文件的扩展名。因此,即使我创建了一个扩展名为“.qwe”(test.qwe)的头文件。那么,为什么要用“.h”作为C++头文件的扩展名。p>
有些人说,我们使用“.cc”作为C++文件的扩展来区别C文件(它有一个扩展名“c”),同样我们使用“.h”作为C++头文件的扩展来区分C头文件(它有一个扩展名“.h”)。我认为这不是一个合理的理由
有人知道这样命名的原因吗?你可以随意命名你的标题,它们甚至可以没有扩展名
提到了标题命名约定。这不是出于任何特定原因,它只
我很难发现为什么这不是编译。我有一个lambda函数,它根据一些参数返回一个std::function
我已经将我的问题缩小到这个片段(它不使用lambdas,但完美地再现了我的错误):
这里,f应该是一些可调用的对象,它将int作为参数,并使用它调用x.bar(int)。另一方面,w只是一个调用some\u-fun(f)的可调用对象,它是f上述可调用对象,具有some\u-fun参数所期望的签名
我错过什么了吗?我可能不知道如何实际混合使用std::bind和std::function som
我有一个简单的课程:
class X
{
std::string S;
X (const std::string& s) : S(s) { }
};
最近我读了一些关于rvalue的文章,我一直在想,我是否应该使用rvalue为X编写构造函数,这样我就可以检测std::string类型的临时对象了
我认为应该是这样的:
X (std::string&& s) : S(s) { }
据我所知,在支持C++11的编译器中实现std::string应该在可用
为什么C/C++标准库中的大多数字符串函数都使用char*指针
标准中甚至没有指定char的有符号性,尽管大多数现代编译器(GCC、MSVC)默认将char视为有符号的
什么时候将字符串视为(可能)有符号字节才有意义?AFAIK在任何字符集中都没有低于零的有意义的字符值。对于某些字符串操作,值必须强制转换为无符号字符
那么为什么stdlib使用char*?甚至是C++特定的方法,比如string::string(const char*)
我很确定大多数字符串函数早于无符号字符的存在
纯char可
简体中文
项目属性>使用多字节字符集
当我运行这个程序时,窗口的标题显示一个字母“s”,而不是一个完整的单词“Sample”
#pragma注释(链接器,“/SubSystem:Windows”)
#包括
int WINAPI WinMain(HINSTANCE HINSTANCE,HINSTANCE,PSTR,int){
WNDCLASSW wc={0};
wc.style=CS_VREDRAW | CS_HREDRAW;
wc.hInstance=hInstance;
wc.hIcon=加载
两个线程A和B。A是一个网络线程,其中有来自客户端的来回信息。B是具有需要线程安全的变量的工作者
类A中有多个线程,而B只是一个线程。A的实例将添加到B的作业列表中,A将锁定,直到B完成任务。(线程安全作业列表工作正常)
A将作业添加到B,然后锁定,但是在大多数情况下,在A锁定之前。B将处理作业,并在A应用锁之前(尝试)释放锁。导致了死锁
我不确定我应该在这里做什么。我可以发布代码,但我认为在概念上更容易讨论 您似乎在使用应该使用条件的锁。引述:
类condition\u variable和co
像这样:
str.erase(0,10);
…使用std::string::substr:
try {
str = str.substr(10);
} catch (std::out_of_range&) {
//oops str is too short!!!
}
我怀疑这里有更多的代码没有显示,问题可能就在那里
这段代码工作得很好:
#include <string>
#include <iostream>
using namespac
我对静态、自动、全局和局部变量有点困惑
在某个地方,我读到一个静态变量只能在函数中访问,但在函数返回后它们仍然存在(保留在内存中)
但是,我也知道一个局部变量也有同样的作用,那么有什么区别呢?函数终止后,局部变量在内存中不存在。
但是静态变量在程序的整个生命周期内保持在内存中分配,而与任何功能无关
此外,根据您的问题,静态变量可以在类或函数范围中本地声明,也可以在命名空间或文件范围中全局声明。它们从头到尾都被分配了内存,只是初始化迟早会发生。首先,我说你应该用谷歌搜索,因为它在很多地方都有详细的
我正在使用Glut在OpenGL中构建一个赛车游戏,我对细节有点迷茫。首先,任何建议或路线图都是非常好的
到目前为止,我的想法是:
转换的树实现
模拟动力学。(*)
用于碰撞检测的八叉树实现
实际碰撞检测。(*)
在Maya中建模并将其导出为.OBJs
用GLSL或类似的东西来提高游戏的图形质量
(*):我不确定这两个的顺序
所以我开始模拟动力学,没有树实现,结果对我来说是一个巨大的混乱。你们有什么办法可以帮我建一棵这样的树用于赛车游戏吗
我曾想过这样的事情,但我不知道如何实现它
红色是静态的
标签: C++
C
static-librariesdebug-symbols
我有一个静态库,我正在调试模式下构建,但当我进入它时,我仍然得到反汇编。我想知道如何使用nm或其他工具来确保调试符号不会被剥离。为您的操作系统下载
它将检测dll是否有调试符号。如果在“符号”下看到“无效”,则表示调试符号已被剥离。有效值为:PDB、CV、DBG等。您可以使用该命令,该命令可用于许多操作系统,包括通过Cygwin的Windows。
如果显示“未剥离”,则表示存在调试信息。
作为旁注,对于静态lib,使用来提取.o文件,并直接在其上使用文件。您可以使用nm的选项--debug sy
我的意思是像eèaèaèaèc这样的东西将变成eeeeeaaacc
我已经试过了
我尝试过手动解析字符串并逐个替换它们,但我认为必须有一种更好/更简单的方法,我不知道(这将保证我不会忘记任何重音字母)
我想知道在标准库的某个地方是否已经有了一个映射,或者是否所有的重音字符都可以使用一些数学函数轻松地映射到“普通”字母(例如:floor(charCode-131/5)+61)。我只在理论上知道它。基本上,您可以执行Unicode规范化,然后进行一些分解,清除所有变音符号,然后重新组合。假设值只是c
这不能是任何形式的Java解决方案。我遇到过EXIficient和OpenEXI,它们都是基于Java的解决方案,不适合我的情况。我在一个嵌入式环境中工作,在这个环境中,我们不会有JVM的“奢侈”。没有多少EXI解析器可用
您可以尝试使用商用但稳定的:
或者进出口银行也不错,但处于阿尔法阶段:
根据您的实施规格,您使用这些应用的里程可能会有所不同。谢谢!我认为进出口银行将是我最终使用的。为这样的东西付钱并不是一个真正的选择。由于我们正在做简单的EXI工作,我认为EXIP目前“足够稳定”。EX
我上了一堂小的“阻塞队列”课。我为传递到enqueue成员函数的值创建了冗余代码,这让我很恼火
以下两个函数的作用完全相同(除了rvalue使用std::move将rvalue移动到实际队列集合中之外),但分别处理lvalue和rvalue的函数除外:
void enqueue(const T& item)
{
std::unique_lock<std::mutex> lock(m);
this->push(item);
是在初始化变量之前调用父类构造函数,还是编译器首先初始化类的变量
例如:
是的,父构造函数总是在派生类之前调用。否则,派生类无法“更改”父类设置的内容 是的,基类在派生类的成员和构造函数体执行之前初始化
12.6.2初始化基和成员[class.base.init]
在非委托构造函数中,初始化在
顺序如下:
-首先,并且仅适用于大多数
派生类(1.8),虚拟基类按以下顺序初始化
它们出现在定向对象从左到右的深度优先遍历上
基类的非循环图,其中“从左到右”是
派生类中基类的外观
基本说明符列表
-
目前,我正在以以下方式同步接收数据
boost::array<char, 2000> buf;
while(true)
{
std::string dt;
size_t len = connect_sock->receive(boost::asio::buffer(buf, 3000));
std::copy
您在第13行的函数声明显示您正在传递1PLAYER对象,而不是数组。如果您想保留数组,请在StackOverflow中搜索“[C++]pass array function”
我强烈建议使用std::vector,因为它在传递到函数时具有更简单的语法。一个ifstream不能转换为fstream,只有istream
在中,您可以看到基本流来自基本流,而不是基本流
让您的功能:
//i have two errors in my code
#include <iostream>
#in
我发现很难理解为什么某些参数是允许的,而其他参数是不允许的
例如,如果是类的静态成员,则可以将const char*作为模板参数,如果在外部定义,则不能
我做了一个小程序来测试所有这些,注释那些没有编译的行。我还根据编译器输出做了一些假设,但它们可能是错误的
模板参数值的规则是什么。我看到对象需要外部链接,但是bool是被授权的,尽管它显然没有任何类型的链接
#include <iostream>
using namespace std;
struct tag {
stat
在C++11中,对齐对性能真的很重要吗
Stroustrup的书中有一条建议,即在结构中对成员进行排序
从最大到最小。但我想知道是否有人
已经做了测量,看看这是否有什么不同,
在编写代码时是否值得考虑。对齐不仅关系到性能,而且关系到正确性。如果数据未正确对齐,或访问错误的内存位置,某些体系结构将因处理器陷阱而失败。在另一些情况下,对未对齐变量的访问被分为多次访问和位移位(通常在硬件内部,有时由OS陷阱处理程序进行),从而失去原子性
建议按大小降序对成员进行排序,是为了优化填充/减少填充所浪费的空
我为llvm编写了一些自己的通行证,以便与clang一起使用它们
我将它们集成到llvm中(不动态加载)。当我键入以下内容时,它们甚至会列在“可用优化:部分”中:
opt --help-hidden
当我调用clang时,我想现在自动运行我自己的一个通行证,作为最后一个通行证:
clang ./hello.bc -o ./hello
甚至使用c代码:
clang ./hello.c -o ./hello
当我使用opt手动运行pass时,修改后的字节码将生成并写入新的.bc文件:
opt
我想我的问题很常见,但它让我发疯:
我有一个5线程的多线程应用程序。其中4个线程完成其工作,如网络通信和本地文件系统访问,然后将其输出写入以下形式的数据结构:
struct Buffer {
std::vector<std::string> lines;
bool has_been_modified;
}
在读取或写入缓冲区时,如何保护缓冲区不被覆盖?
我找不到一个合适的解决方案,尽管我认为这是一个很常见的问题
谢谢。您可以在缓冲区周围使用一个或多个互斥体,以确保它们不会被
标签: C++
C
language-lawyer
alignof(char)可以不是1吗
从:
最弱(最小)对齐是类型char、signed char和unsigned char的对齐,通常为1
“通常”似乎意味着它可能是其他东西
C标准关于字符对齐的唯一规定是(C11 N1570 6.2.8第1段):
可以使用\u Alignof表达式查询完整类型的对齐要求。char、signed char和unsigned char类型的对齐要求最低
但是,考虑对齐的定义(C11N15702.2.8段1,并且类似于C++ 11定义):
对齐是一个实现定义的
我得到了一段使用void()作为参数的代码。代码没有编译。。。显然
我们可以实例化任何类型的void?我相信答案是否定的,除了一个void*。例如:
编写函数void askVoid(void param){}时出错:
参数可能没有void类型
编写函数void askNaught(){}并使用askNaught(void())调用它`错误:
错误C2660:takenout:函数不接受1个参数
编写模板化函数template void takeGeneric(T param){}并使用take
Windows 10 x64,
ffmpeg:3.1,预构建DLL
这里绝对是初学者
我试着用一种非常基本的方法来解码视频文件中的帧,但每次尝试都失败了。最后一段代码如下所示:
#define __STDC_CONSTANT_MACROS
extern "C" {
#include<libavutil/avutil.h>
#include<libavutil/imgutils.h>
#include <libavformat/avformat.h>
#incl
我有两门课:inreading和InuTask。看起来像这样:
正在读取的标题:
class InuReading{
public:
InuReading(String t, String l){
type = t;
label = l;
};
String type;
String label;
std::map<String, String> d
标签: C++
timeoutcommand-line-interfacecoin-or-cbc
我正在通过它的cbc命令行工具使用,如果计算时间过长,我需要中止一些计算
我知道我可以围绕cbc编写一个控制进程,在超时过期后终止它。我也知道我可以使用CBC作为C++库。两者看起来都很麻烦,我正在寻找一个更简单、直接的解决方案
这是否可以直接通过cbc命令行工具实现
如果不是,有没有一种使用CBC作为C++库的简单方法?(读取*.lp文件,应用超时,创建*.soln文件)是。使用-sec命令行选项。完整的命令行是:
cbc -sec 10 -import inputfile.lp -solve
标签: C++
constructorlanguage-lawyer
中定义了存储重用。我不知道在构造函数执行期间(重新)使用存储时如何阅读本节
是UB吗
不,不是[basic.life]/5说:
程序可以通过重用对象占用的存储来结束任何对象的生命周期,或者通过使用非平凡析构函数显式调用类类型对象的析构函数来结束任何对象的生命周期。对于具有非平凡析构函数的类类型的对象,在重用或释放该对象占用的存储之前,程序不需要显式调用析构函数;但是,如果没有显式调用析构函数,或者如果没有使用删除表达式来释放存储,则不应隐式调用析构函数,并且依赖于析构函数产生的副作用的任何程序都
描述如何流式传输独立的std::variant。但是,当std::variant存储在std::unordered\u映射中时,它似乎不起作用
以下是:
#包括
#包括
#包括
#包括
#包括
// https://stackoverflow.com/a/46893057/8414561
模板
std::ostream&operator问题在于std::endl,但我不明白为什么您的重载比来自以下方面的重载更匹配:
出于某种原因,您的代码(在我看来是正确的)正在尝试在clang和gcc中实例化s
标签: C++
language-lawyerc++20std-source-location
拥有一个通过摄像头扫描手写文件的编译器将是一个符合要求的实现。虽然实际上没有那么大的意义
然而,C++20现在添加了源位置。这是否意味着源代码应始终存储在文件中?即使在C++20之前,该标准也有:
当前源文件的假定名称(字符串文字)
源位置::文件名的定义相同
因此,在支持C++20中的无文件系统实现方面没有任何变化
该标准没有准确定义“源文件”的含义,因此它是否引用文件系统可能取决于解释。假设一个实现生成“您刚才给我的手写便条”,如果它确实标识了该语言实现中的“源文件”,那么它可能符合要求
这个问题更具理论性,其范围不同于:
-解释编译器甚至在查看专门化之前都会重载解析
-描述两种机制之间的差异
让我们进入理论问题:
template <typename T>
T add(T a, T b)
{
return a + b;
}
template <>
int add<int>(int a, int b)
{
return a + b; //Specialization
}
int add(int a, int b)
{
我要填充以下结构:
struct Data{
char id; // 1 byte
char date[7]; // 7 bytes
short int Ny; // 2 bytes
short int Nx;
short int L;
unsigned char distance;
short int N;
std::vector<short int> quant_levels;
std::vector<
我需要在代码的关键部分创建一个多层树。标准方法是使用以下内容:
struct node{ // or class
... data ...
std::unordered_set<node*> children
};
node* root;
删除树只需使用tree.clear()即可
对于大(或巨大)树,它有可能更快吗?考虑到std::unordered_set的每个实例仍然会导致堆上至少多分配一次(内部),实际实现的节省是有困难的。您将节省不到50%的必要堆分配
重要的
标签: C++
c++17template-argument-deduction
我有以下课程:
template<typename R, typename... Args>
class Callable final
{
public:
Callable(void* args, R(*fn)(Args...));
Callable(void* args, std::function<R(Args...)> &&fn);
/* parse args into a tuple<Args...>