我正在使用枚举,并尝试从此页面重现一些示例.最初的例子按预期工作,但是我得到了一些有趣的结果,代码如下:
#include <iostream>
enum num : char {
zero = '0',
one = '1',
two = '2',
three = '3',
four = '4',
five = '5',
six = '6'
};
int main()
{
const char two = '2';
std::cout << two << std::endl;
std::cout << num::two;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
2
50
我预计两种结果都是相同的,但num::two
似乎打印出其他一些值.此值也不会改变(50)
,所以我假设这不是随机/垃圾值,并且有一些char/int解析正在完成,我不明白?这是ideone链接.
我知道我可以通过这样分配来实现它zero = 0
,没有单引号并且它有效.但是,我想知道幕后发生了什么,我怎么能控制通过单引号分配可以打印的非单位数值.
例如 -
#include <memory>
int main(){
const auto bufSize = 1024;
auto buffer = std::make_unique<char[]>(bufSize);
}
Run Code Online (Sandbox Code Playgroud)
这里的缓冲区是否已经填充了'\0'
字符,或者我必须手动填充它以避免垃圾值.
什么可能的方法,这样就std::memset(&buffer.get(), 0, bufSize)
足够了?
我有一个父类,有两个或更多的子类派生自它.随着更多要求的出现,未来不同子类的数量可能会增加,但它们都将遵循基类方案,并且将包含很少的独特方法.让我举一个例子 -
#include <iostream>
#include <string>
#include <vector>
#include <memory>
class B{
private: int a; int b;
public: B(const int _a, const int _b) : a(_a), b(_b){}
virtual void tell(){ std::cout << "BASE" << std::endl; }
};
class C : public B{
std::string s;
public: C(int _a, int _b, std::string _s) : B(_a, _b), s(_s){}
void tell() override { std::cout << "CHILD C" << std::endl; }
void CFunc() {std::cout << "Can be called only from C" << std::endl;}
};
class …
Run Code Online (Sandbox Code Playgroud) 如何argv
在int128_t
支持下使用值?我知道atoi()
暴露的函数和函数系列,<cstdlib>
但不知怎的,我找不到一个int128_t
固定宽度整数.这可能是因为这type
不受c或c ++标准的支持,但是我有什么方法可以让这段代码工作吗?
#include <iostream>
int main(int argc, char **argv) {
__int128_t value = atoint128_t(argv[1]);
}
Run Code Online (Sandbox Code Playgroud)
几乎所有发布的答案对我来说都足够好了,但我选择的是当前代码的解决方案,所以也要查看其他答案.
按照我之前的问题,我对这段代码非常好奇 -
case AF_INET:
{
struct sockaddr_in * tmp =
reinterpret_cast<struct sockaddr_in *> (&addrStruct);
tmp->sin_family = AF_INET;
tmp->sin_port = htons(port);
inet_pton(AF_INET, addr, tmp->sin_addr);
}
break;
Run Code Online (Sandbox Code Playgroud)
在提出这个问题之前,我已经搜索了关于同一主题的SO,并对此主题进行了混合回答.例如,看到这个,这个和这个帖子说,使用这种代码在某种程度上是安全的.还有另一篇文章说使用工会来完成这样的任务,但是对接受的答案的评论再次提出不同意见.
微软关于相同结构的文档说 -
应用程序开发人员通常只使用SOCKADDR_STORAGE的ss_family成员.其余成员确保SOCKADDR_STORAGE可以包含IPv6或IPv4地址,并且适当填充结构以实现64位对齐.这种对齐使协议特定的套接字地址数据结构能够访问SOCKADDR_STORAGE结构中的字段而不会出现对齐问题.通过填充,SOCKADDR_STORAGE结构的长度为128个字节.
Opengroup的文件说明 -
标题应定义sockaddr_storage结构.该结构应为:
足够大以容纳所有支持的协议特定的地址结构
在适当的边界对齐,以便指向它的指针可以作为指向协议特定地址结构的指针,并用于访问这些结构的字段而没有对齐问题
socket的 man页面也说同样 -
此外,套接字API提供数据类型struct sockaddr_storage.此类型适用于容纳所有受支持的特定于域的套接字地址结构; 它足够大并且正确对齐.(特别是,它足以容纳IPv6套接字地址.)
我已经使用这两种类型转换看到多种实现C
与C++
语言在野外,现在我不确定的事实,哪一个是正确的,因为有一些帖子说上述的权利要求相矛盾- 这个和这个.
那么哪一个是填充sockaddr_storage
结构的安全和正确的方法?这些指针转换是否安全?还是工会方法?我也知道这个getaddrinfo()
电话,但对于刚刚填充结构的上述任务来说,这似乎有点复杂.memcpy还有另外一种推荐的方法,这样安全吗?
我发现std::string
与老式的以null结尾的字符串相比,s非常慢,速度非常慢,以至于它们将整个程序的速度降低了2倍.
我预计STL会变慢,我没有意识到它会慢得多.
我正在使用Visual Studio 2008,发布模式.它显示字符串的char*
赋值比赋值慢100-1000倍(测试char*
赋值的运行时非常困难).我知道这不是一个公平的比较,指针赋值与字符串复制,但我的程序有很多字符串赋值,我不确定我可以在所有地方使用" const引用 "技巧.通过引用计数实现,我的程序可以很好,但这些实现似乎不再存在.
我真正的问题是:为什么人们不再使用引用计数实现,这是否意味着我们都需要更加谨慎地避免std :: string的常见性能缺陷?
我的完整代码如下.
#include <string>
#include <iostream>
#include <time.h>
using std::cout;
void stop()
{
}
int main(int argc, char* argv[])
{
#define LIMIT 100000000
clock_t start;
std::string foo1 = "Hello there buddy";
std::string foo2 = "Hello there buddy, yeah you too";
std::string f;
start = clock();
for (int i=0; i < LIMIT; i++) {
stop();
f = foo1;
foo1 = foo2;
foo2 = f;
}
double …
Run Code Online (Sandbox Code Playgroud) 本月我通过使用vagrant box add laravel/homestead下载了Homestead box thrid time.我目前无法访问快速互联网,因此每次下载都非常烦人.有没有办法再次使用下载的软件包并将本地软件包包含在vagrant中,如果保留项目或同步位置,则无关紧要.
如果重要的话,我在Ubuntu机器上.
更新:我需要下载的Homestead盒子,这样如果我的机器出现故障或者我必须在没有/慢速互联网连接的其他地方安装它,我可以在本地进行.
我有一些代码,看起来像这样,我不知道该如何处理,因为这代码的一部分,在无限循环运行,同时等待连接,当我终止程序,它从那里只有退出,这将永远不会得到执行的部分.
main(){
// do some stuff....
while(1) {
int newFD =
accept(sockFD, (struct sockaddr *)&client_addr, &client_addr_size);
if(newFD == -1) {
std::cerr << "Error while Accepting on socket" << std::endl;
continue;
}
if(!fork()) {
close(sockFD); // close child's sockfd - not needed here
// lalala do stuff send message here
close(newFD); // finally close its newFD - message sent, no use
return 0;
}
close(newFD); // close parent's newFD - no use here
}
// now execution never reaches here
close(sockFD); …
Run Code Online (Sandbox Code Playgroud) 我现在有一个我曾经见过的最糟糕的bug系统,它似乎只有两种可能的解释 -
好吧,让我给你一些背景知识.我正在为raspberry pi gpio操作编写一个c ++程序.据我所知,程序中没有明显的错误,因为它成功地与sudo一起工作,并且也成功地延迟了.所以这里是rpi的gpio如何工作 -
首先你要导出一个,保留它进行操作,它将创建一个新目录,
gpio+number
其中包含几个文件.
echo 17 > /sys/class/gpio/export
然后设置它的方向(在读取和退出意味着写入)
echo "out" > /sys/class/gpio/gpio17/direction
然后写入值(0或1表示关闭和打开)
echo 1 > /sys/class/gpio/gpio17/value
最后,将其取消导出,该目录将被删除.
echo 17 > /sys/class/gpio/unexport
无论您是通过bash命令还是通过c/c ++或任何其他语言IO执行此操作都无关紧要,因为在unix中这些只是文件,您只需要读取/写入它们即可.到目前为止一切正常.我已经手动测试了它并且它可以工作,所以我的手动测试通过.
现在我为我的程序编写了一个简单的测试,看起来像这样 -
TEST(LEDWrites, LedDevice)
{
Led led1(17, "MyLED");
// auto b = sleep(1);
EXPECT_EQ(true, led1.on());
}
Run Code Online (Sandbox Code Playgroud)
Led类constructor
执行导出部分 - echo 17 > /sys/class/gpio/export
当.on()
调用设置方向时 - echo "write" > /sys/class/gpio/gpio17/direction
并输出值 - echo 1 > /sys/class/gpio/gpio17/value
.忘掉这里的devport,因为它是由析构函数处理的,在这里不起作用.
如果你很好奇,这些函数会像这样处理I/O -
{
const std::string direction = …
Run Code Online (Sandbox Code Playgroud) 我应该如何将匿名联盟归零?我在cppreference页面上找不到任何关于它的内容.将memset
荷兰国际集团是最大的成员与0
在这里工作?
例如 -
#include <iostream>
#include <cstring>
struct s{
char a;
char b[100];
};
int main(){
union {
int a;
s b;
char c;
};
// b.a = 'a'; (1)
std::memset(&b, 0, sizeof(b));
std::cout << a << "\n";
std::cout << b.a << " " << b.b << "\n";
std::cout << c << "\n";
}
Run Code Online (Sandbox Code Playgroud)
如果这样可行,我应该在使用memset()
激活最大的成员之前取消注释(1)吗?