有没有办法用C++确定linux中usb-drive的s/n?
如果不是C++是否有任何其他方式,从不同的hwinfo -disk和hdparm -i?
我有带有静态成员的静态库。该库静态链接到主应用程序及其插件之一。看起来像在 main(应用程序)和 dll(插件)中初始化静态变量。
\n\n问题:如何避免动态库加载时静态变量重新初始化。或者我可能错过了一些简单的事情?
\n\n更多信息:
\n\n这是一个简单的静态库,包含静态成员及其 getter 和 setter:
\n\norbhelper.h\n
\n\nclass ORBHelper {\n static std::string sss_;\npublic:\n static std::string getStr();\n static void setSTR(std::string str);\n};\nRun Code Online (Sandbox Code Playgroud)\n\norbhelper.cpp\n
\n\nstd::string ORBHelper::sss_ = "init";\n\nstatic std::string ORBHelper::getStr()\n{\n std::cerr << "get " << sss_.c_str() << std::endl;\n return sss_;\n}\nstatic void ORBHelper::setSTR(std::string str)\n{\n sss_ = str;\n std::cerr << "set " << sss_.c_str() << std::endl;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n该库在 main.cpp 中使用,也在另一个动态库中使用,该动态库在 main.cpp 中加载。\n在 main.cpp 中我设置了静态字符串,并在一个动态库函数中我想获取它。
\n\n在 main 中设置静态变量:
\n\n主.cpp\n
\n\n...\nORBHelper::setStr("main");\nstd::cerr << ORBHelper::getStr().c_str() …Run Code Online (Sandbox Code Playgroud) 还是我在测量别的东西?
在这段代码中,我有一堆标签 ( integers)。每个标签都有一个字符串表示(const char*或std::string_view)。在循环堆栈值被转换为相应的字符串值。这些值附加到预先分配的字符串或分配给数组元素。
结果表明,带有std::string_view的版本比带有 的版本稍快const char*。
代码:
#include <array>
#include <iostream>
#include <chrono>
#include <stack>
#include <string_view>
using namespace std;
int main()
{
enum Tag : int { TAG_A, TAG_B, TAG_C, TAG_D, TAG_E, TAG_F };
constexpr const char* tag_value[] =
{ "AAA", "BBB", "CCC", "DDD", "EEE", "FFF" };
constexpr std::string_view tag_values[] =
{ "AAA", "BBB", "CCC", "DDD", "EEE", "FFF" };
const size_t iterations = 10000;
std::stack<Tag> stack_tag;
std::string out; …Run Code Online (Sandbox Code Playgroud) 我有一个可以隐式转换为函数可接受的类型的结构std::map::insert()。
我按原样使用结构,但出现编译错误:
没有重载函数可以转换所有参数类型
但是,如果我使用显式转换结构static_cast,它会被接受。
我的问题是,为什么隐式转换在这里不起作用?
示例代码:
struct MyStruct
{
MyStruct(std::string s, int i) : data(s, i) {}
operator std::pair<std::string, int>() const
{
return data;
}
private:
std::pair<std::string, int> data;
};
MyStruct my_val1("hello", 4);
MyStruct my_val2("world", 2);
std::map<std::string, int> my_map {};
my_map.insert(static_cast<std::pair<std::string, int>>(my_val1)); // compiles
my_map.insert(my_val2); // not compiles
Run Code Online (Sandbox Code Playgroud) 我正在使用omniORB和C++.
在我的应用程序中,我得到了几个不同模块的小CORBA序列,然后我需要将它们组合成一个大序列以进行进一步处理.有这么简单的方法吗?像seq2.append(seq1)或的东西seq2.push_back(seq1).还是一些运营商?(我真的是STL-things的新手).
我发现的唯一方法是手动遍历小序列的每个元素并将其添加到大序列中.
//idl
struct Device;
typedef sequence<Device> DevicesList;
//c++
icore::DevicesList full_list;
foreach (const DStatusList &stlist, states_) {
icore::DevicesList list = convertList(stlist);
int newlength = full_list.length() + list.length();
int last_index = full_list.length();
full_list.length(newlength);
int j=0;
for(int i=last_index; i< last_index+list.length(); i++,j++) {
full_list[i] = list[j];
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
考虑使用默认比较稍微修改一下 cppreferenece.com 的示例:
struct Point
{
int x;
int y;
auto operator<=>(const Point&) const = default;
//bool operator!=(const Point&) const = default;
bool isDifferent(const Point& another) const
{
// Fails without explicit operator !=
return operator != (another);
}
bool isSame(const Point& another) const
{
// Always OK
return operator == (another);
}
};
int main()
{
Point pt1{1, 1}, pt2{1, 2};
std::cout << std::boolalpha
<< (pt1 == pt2) << ' ' // Always OK
<< (pt1 != …Run Code Online (Sandbox Code Playgroud) c++ ×6
benchmarking ×1
c ×1
c++20 ×1
corba ×1
linux ×1
omniorb ×1
optimization ×1
sequence ×1
string-view ×1
usb-drive ×1