我有一个相当大的C++应用程序(在Windows上,没有计划其他平台),它目前存储Windows注册表中的所有设置(甚至某种地址).
有时这很不方便,因为用户在更改注册表中的条目时遇到困难.我想设置版本,因此设置始终与当前代码匹配.目前我们对reg-files进行了版本控制,但是如果所有的reg文件都已添加到目标计算机上,那么您永远不会确定.使用C#,您可以在app.config中定义默认值,但不要覆盖现有设置.我不知道,如果C++存在这样的机制或库.
我想拥有以下"功能":
据我所知,在Windows上存储设置有3种可能性:
我们套件中只有一个应用程序目前使用Qt,但Boost可用.
对于地址,我们会将它们放在某种XML地址簿中,但对于其他设置,我们不确定,最佳做法是什么.
我有一个基类,它定义了一个Qt插槽
class Base
{
public:
Base()
{
connect(otherobject, SIGNAL(mySignal), this, SLOT(mySlot));
}
public slots:
virtual void mySlot()
{}
}
Run Code Online (Sandbox Code Playgroud)
子类A只是实现了一些其他的东西.子类B覆盖插槽
class SubB : Base
{
public:
SubB() : Base()
{
// Necessary?
connect(otherobject, SIGNAL(mySignal), this, SLOT(mySlot));
}
public slots:
virtual void mySlot() override
{}
}
Run Code Online (Sandbox Code Playgroud)
插槽的覆盖是否也替换了之前在Bass构造函数中完成的连接(即SubB中的连接是不必要的)?
我们刚刚在我们的代码库中发现了一个问题,即语句在 return 语句之后。
例如
std::string MyClass::addElement(Type1 &item, const std::string ¶m2)
{
if (param2.empty())
{
// logging
return "";
}
return m_database->addElement(item, param2, item.status, true);
// here I would expect an unreachable code warning
m_database->updateTableA(item.p1, item.p2, item.p3, AType::AType23);
}
Run Code Online (Sandbox Code Playgroud)
我不明白的是,为什么我们的编译器(GCC 4.8.5 和 7)不发出警告?
我们编译 -std=c++0x -Wall -Wextra -Wsign-compare -Wunknown-pragmas -Wold-style-cast -Wshadow -Wfatal-errors
我使用以下方法写入跟踪文件(受/sf/answers/1123224511/启发)
void Tracing::Info( const char* content, ...)
{
va_list paramList;
va_start( paramList, content );
Tracing::AddRecord(boost::log::trivial::info, content, paramList);
va_end( paramList );
}
void Tracing::AddRecord(boost::log::trivial::severity_level sev, const char* content, va_list paramList)
{
int size = vsnprintf(0, 0, content, paramList) + 1;
if (size > 0)
{
boost::scoped_array<char> formattedString(new char[size]);
vsnprintf(formattedString.get(), size, content, paramList);
boost::log::sources::severity_logger_mt<boost::log::trivial::severity_level> & lg = my_logger::get();
BOOST_LOG_SEV(lg, sev) << formattedString.get();
}
}
Run Code Online (Sandbox Code Playgroud)
如果我在Linux下使用以下方法调用该方法(CentOS 7,GCC 4.8.2):
Tracing trace;
trace.Error("No %s root tag found!", rootTag.c_str());
Run Code Online (Sandbox Code Playgroud)
它在AddRecord()中第二次调用vsnprintf时会出现段错误.
如果使用数字格式化程序(例如%i)调用它,它可以正常工作.我已经在Windows(VS2008/2010)下使用这些方法多年没有问题.
我错过了一些明显的东西吗?
它是如何工作的?
struct Person
{
std::string name;
std::string address;
};
std::istream &read(std::istream &is, Person &person)
{
is>> person.name;
getline(is, person.address);
return is;
}
int main()
{
Person p;
read(cin,p);
}
Run Code Online (Sandbox Code Playgroud)
怎么return is回归两者person.name 和person.address一起getline似乎是分开的is?
我不明白为什么下面的C程序返回值34?
int main(void)
{
char c;
char c1='a', c2='b';
c= c1*c2;
printf("%d", c);
}
Run Code Online (Sandbox Code Playgroud)
任何帮助是极大的赞赏!
#include <bits/stdc++.h>
using namespace std;
struct node
{
std::string a;
};
int main()
{
cout << str << endl;
struct node* p = (struct node*)(malloc(sizeof(struct node)));
p->a = "a";
cout << p->a;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码产生运行时错误。该结构适用于整数,但是当我尝试使用字符串作为其成员变量时,会发生错误。它还会在代码cheide上给出运行时错误。
请考虑以下代码:
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int main() {
int a, b;
cout << "Enter two integer: ";
cin >> a >> b;
if (a > b) {
int temp = a;
a = b;
b = temp;
}
cout << a << "<=" << b << endl;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码产生两个插入数字中的最小值。谁能解释if块如何工作?