TypechoJoeTheme

鱼一的博客 ◡̈

yuyi

知不可乎骤得,托遗响于悲风
网站页面
标签搜索
搜索到 26 篇与 的结果
2023-02-10

Pico4 开发试玩

Pico4 开发试玩
在 Pico4 上运行示例 demo开发环境准备demo 代码运行开发环境准备下载 Android Studio 并通过其安装 Android SDK、相应的 NDK 以进行 Pico4 设备上的原生 c++ 混合应用开发。注意问题 ⚠️:Android sdk、 Cmake、 JDK 等开发环境版本和项目代码中使用的版本对应。 Could not GET ‘https://dl.google.com/dl/android/maven2/com/android/tools/b***.pom 报错解决办法,取消 Android Studio 代理设置,在 gradle.property(global) 中注释掉代理设置代码,重启 Android Studio.demo 代码运行从 pico4 开发者官网下载原生开发的 Pico_openXR_SDK 文件,其中包含对应 pico4 版本的 helloXR 项目。使用 Android Studio 打开该项目,构建 gradle 运行环境。连接 pico4 物理设备到电脑,检测到设备后,点击运行。项目浅识一级目录文件及其作用├── ...
2023-02-10
2023年02月10日
0 阅读
0 评论
2023-01-04

C++中宏使用的隐患

C++中宏使用的隐患
让我们通过一些简单的C++例子来解释上述宏使用中的问题。可读性差宏由于其简单的文本替换机制,可以将简短的命令展开成复杂的代码片段,这可能导致代码难以阅读和理解。#define SQUARE(x) ((x)*(x)) int main() { int result = SQUARE(1+2); // 预期是3的平方,即9 }在这个例子中,SQUARE(1+2) 展开后变成了 ((1+2)*(1+2)),这还算直观。但如果宏本身非常复杂,它的展开会使代码难以理解。潜在的副作用宏的另一个问题是可能引入潜在的副作用,特别是当宏的参数在宏展开中被多次求值时。#define MAX(a,b) ((a)>(b)?(a):(b)) int main() { int i = 5; int maxVal = MAX(i++, 0); // 预期是什么?可能不是你想象的结果。 }在这个例子中,i++ 在宏展开中被评估了两次,这可能不是预期的行为。如果a大于b,i会增加两次。这种副作用很难追踪,尤其在复杂的代码中。缺乏类型检查由于宏只是简单的文本替换,不进行类型检查,这...
2023-01-04
2023年01月04日
0 阅读
0 评论
2023-01-03

c+命令行编译相关之动态链接

c+命令行编译相关之动态链接
在大多数情况下,使用 g++ 编译并链接C++程序时,默认情况下会使用动态链接来链接到C++标准库和其他系统库。因此,对于大多数基本的用例,你实际上不需要在命令行上添加任何特殊内容来启用动态链接。g++ program.cpp -o program这条命令已经隐含了动态链接。编译器在处理时会自动寻找系统上的动态链接库(比如C++标准库的动态版本),并确保你的程序在运行时能够使用这些库。明确使用动态链接库如果你需要链接到特定的动态链接库(不是标准库),比如一个第三方库或你自己编写的库,你可能需要明确指定库的路径和名称。这通常通过 -l(指定库名称)和 -L(指定库文件搜索目录)选项完成。例如,如果你要链接到一个名为 libmath 的库:g++ program.cpp -o program -L/path/to/library -lmath在这里:-L/path/to/library 告诉编译器在 /path/to/library 目录下查找库文件。-lmath 指定链接器链接名为 libmath.so(在Linux上)或 math.dll(在Windows上)的库。注意,-l 选...
2023-01-03
2023年01月03日
0 阅读
0 评论
2022-11-20

线程基本知识

线程基本知识
在C++中,线程的创建和销毁是通过C++11标准引入的 <thread> 库实现的,这使得处理线程变得相对直观和安全。下面,我将为你介绍如何在C++中创建、使用和销毁线程。创建线程要创建一个线程,你需要包含头文件 <thread> 并创建一个 std::thread 对象。在创建时,可以传递一个函数或者可调用对象给线程,该函数或对象将作为新线程的入口点。这里是一个简单的例子:#include <iostream> #include <thread> void function() { std::cout << "Thread is running." << std::endl; } int main() { std::thread t(function); // 创建一个线程,线程开始执行 function t.join(); // 等待线程结束 return 0; }在上面的例子中,我们创建了一个执行 function 的线程。function 只...
2022-11-20
2022年11月20日
0 阅读
0 评论
2020-04-16

handy 库

handy 库
handy 库的事件驱动原理handy 的事件驱动模型是基于 Reactor 模式实现的,主要包括以下几个组件:EventBase:事件循环基类,负责事件循环和事件分发。Channel:事件通道类,负责事件的注册、删除和分发。Poller:事件分发器类,负责事件的分发和处理。TimerQueue:定时器队列类,负责定时器的管理和触发。在 handy 中,每个 EventBase 对象都有一个 Poller 对象和一个 TimerQueue 对象,用于处理事件和定时器。当一个事件发生时,Channel 对象会将事件添加到 EventBase 对象的事件队列中,然后 EventBase 对象会调用 Poller 对象的 poll 函数等待事件的发生。当事件发生时,Poller 对象会将事件分发给对应的 Channel 对象进行处理。同时,EventBase 对象还会定期检查 TimerQueue 对象中的定时器,如果有定时器到期,就会触发定时器回调函数。总的来说,handy 的事件驱动模型是基于 Reactor 模式实现的,通过 EventBase、Channel、Poller 和 ...
2020-04-16
2020年04月16日
0 阅读
0 评论
2020-04-10

TCP 学习笔记

TCP 学习笔记
TCP in handy libserver#include <handy/handy.h> using namespace std; using namespace handy; int main(int argc, const char *argv[]) { Logger::getLogger().setLogLevel(Logger::LTRACE); EventBase base; Signal::signal(SIGINT, [&] { base.exit(); }); // 启动服务端, 绑定地址 host 和对应的端口 port。 保持监听 20 TcpServerPtr echo = TcpServer::startServer(&base, "", 2099); exitif(echo == NULL, "start tcp server failed"); // 服务端正常运行后,实现 tcp 链接回调函数 echo->...
2020-04-10
2020年04月10日
0 阅读
0 评论

More Info for me 📱

IP信息

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月