天道酬勤,学无止境

Does a typedef to self have any effect? 相关文章

原文信息:Does a typedef to self have any effect?

I've come across some C++ code that has the following: typedef Request Request; Is this just a no-op or does this typedef actual have an effect, and if so, what effect does it have?


更多相关搜索:点击搜索查看



静态成员函数中包含类的C ++类型(C++ type of enclosing class in static member function)
问题 我认为这是完全不可能的,但是如果可以的话。 在任何版本的C ++中,是否有可能以某种方式获取静态成员函数中的封闭类的类型? class Impossible { public: static void Fun() { typedef Impossible EnclosingClass; // now do something with EnclosingClass ... } } 有没有一种方法可以获取封闭类的类型(在这种情况下是Impossible )而无需在函数中编写类的名称? 我想要这样做的原因是避免在函数中重复类名。 如果发生以下情况,很容易导致难以发现复制粘贴错误: class SomeOther { // another class, with the same interface as Impossible public: static void Fun() { typedef Impossible EnclosingClass; // whoops, copy-pasted, forgot to change "Impossible" to "SomeOther" // now do something with EnclosingClass ... } } 有防止这种情况发生的好方法吗? 我可以想象碰到在封闭类中声明为私有的东西,但是那将迫使我编写额外的代码

2021-04-07 17:32:34    分类:技术分享    c++   types   static-methods

C中的OO多态性,别名问题?(OO Polymorphism in C, aliasing issues?)
问题 我和一位同事正在尝试实现一个简单的多态类层次结构。 我们正在开发一个嵌入式系统,并且仅限于使用 C 编译器。 我们有一个基本的设计思想,可以在没有警告的情况下编译(-Wall -Wextra -fstrict-aliasing -pedantic)并且在 gcc 4.8.1 下运行良好。 但是,我们有点担心混叠问题,因为我们不完全了解这何时会成为问题。 为了演示,我们编写了一个带有“接口”IHello 和两个实现该接口“Cat”和“Dog”的类的玩具示例。 #include <stdio.h> /* -------- IHello -------- */ struct IHello_; typedef struct IHello_ { void (*SayHello)(const struct IHello_* self, const char* greeting); } IHello; /* Helper function */ void SayHello(const IHello* self, const char* greeting) { self->SayHello(self, greeting); } /* -------- Cat -------- */ typedef struct Cat_ { IHello hello; const char* name

2021-09-22 09:10:43    分类:技术分享    c   oop   polymorphism   strict-aliasing

此模板代码不会编译。 有任何想法吗? [关闭](This template code will not compile. Any ideas? [closed])
问题 这个问题不太可能对任何未来的访客有帮助; 它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于互联网的全球受众。 如需帮助使此问题更广泛地适用,请访问帮助中心。 9年前关闭。 我从 rhalbersma 得到了这段代码,但它不能在 VC 2010 中编译。我不知道我做错了什么。 template<typename Derived> struct enable_crtp { private: // typedefs typedef enable_crtp Base; public: // casting "down" the inheritance hierarchy Derived const* self() const { return static_cast<Derived const*>(this); } // write the non-const version in terms of the const version // Effective C++ 3rd ed., Item 3 (p. 24-25) Derived* self() { return const_cast<Derived*>(static_cast<Base const*>(this)->self()); } protected: // disable

2021-11-18 17:11:14    分类:技术分享    c++   templates

OO Polymorphism in C, aliasing issues?
Me and a colleague are trying to achieve a simple polymorphic class hierarchy. We're working on an embedded system and are restricted to only using a C compiler. We have a basic design idea that compiles without warnings (-Wall -Wextra -fstrict-aliasing -pedantic) and runs fine under gcc 4.8.1. However, we are a bit worried about aliasing issues as we do not fully understand when this becomes a problem. In order to demonstrate we have written a toy example with an 'interface' IHello and two classes implementing this interface 'Cat' and 'Dog. #include <stdio.h> /* -------- IHello -------- */

2021-06-09 16:51:33    分类:问答    c   oop   polymorphism   strict-aliasing

如何在 C# 中为内置类型设置别名?(How to alias a built-in type in C#?)
问题 所以在 C++ 中,我习惯于能够做到: typedef int PeerId; 这使我可以使类型更具自文档性,而且还允许我随时使 PeerId 表示不同的类型,而无需更改所有代码。 如果我愿意,我什至可以将 PeerId 变成一个类。 这种可扩展性是我想要在 C# 中拥有的,但是我无法弄清楚如何在 C# 中为“int”创建别名。 我想我可以使用 using 语句,但它只在我相信的当前文件中具有范围,因此不起作用(别名需要在多个文件之间可以访问而无需重新定义)。 我也无法从内置类型派生类(但通常这是我对引用类型的别名所做的事情,例如列表或字典)。 我不确定我能做什么。 有任何想法吗? 回答1 您需要像这样使用完整的类型名称: using DWORD = System.Int32; 回答2 您可以(ab)使用隐式转换: struct PeerId { private int peer; public static implicit operator PeerId(int i) { return new PeerId {peer=i}; } public static implicit operator int(PeerId p) { return p.peer; } } 这与 int 占用相同的空间,您可以执行以下操作: PeerId p = 3; int i = p

2021-12-12 09:00:57    分类:技术分享    c#   alias

如何在iOS中异步下载多张图片而不影响UI? [关闭](How to download multiple images asynchronously in iOS without effect on UI? [closed])
问题 关闭。 此问题不符合堆栈溢出准则。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 7年前关闭。 改善这个问题 我有100个网址,我想下载所有这些图像并保存在“文档”中。 为了节省,我也可以进行延迟加载,但是我无法在最短的时间内下载所有文件,并且GUI不应挂起。 什么是合适的方法? 谢谢 回答1 使用SDWebImage。 您可以从以下网址下载 https://github.com/rs/SDWebImage 使用异步请求加载100张图像 for(int i=0; i<99; i++) { strImage=[[res valueForKey:@"result"] objectAtIndex:i]; if ([[strImage lowercaseString] hasSuffix:@".jpg"] || [[strImage lowercaseString] hasSuffix:@".png"]) { //[HUD show:YES]; NSURL *url=[[NSURL alloc]initWithString:strImage]; NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; [NSURLConnection

2021-05-24 14:02:07    分类:技术分享    ios   multithreading   image   asynchronous

对结构进行 typedef 对自身的影响是什么? [复制](What is the effect of typedef'ing a struct to itself? [duplicate])
问题 这个问题在这里已经有了答案: C++ 中“struct”和“typedef struct”的区别? (8 个回答) 7年前关闭。 我已经看到这段代码写在 API 的顶部: typedef struct SYSTEM SYSTEM; SYSTEM类型以前未定义。 有谁知道这是做什么的? 在这一行之后,编译器认为SYSTEM什么? 感谢您的回答! 我的问题是 SYSTEM 之前没有在文件中定义,所以我不知道它是什么。 例如,该行将自行编译,但没有在任何地方定义struct SYSTEM 。 回答1 它允许您在 C 中使用名称SYSTEM而不是使用struct SYSTEM 。 typedef创建一个同义词SYSTEM到struct SYSTEM 。 在您的情况下,由于未声明struct SYSTEM ,该声明还将struct SYSTEM声明为不完整的类型,就像在此声明中一样: struct SYSTEM; . 然后可以在另一个翻译单元中声明完整的对象类型struct SYSTEM 。 回答2 这实际上只在 C 中有效和有用。 在 C 中,您必须键入struct type ,而 C++ 允许您省略类型的struct部分而只写type 。 typedef struct type type允许您在 C 中使用type ,而不必在结构名称前使用struct关键字。 不过,一些 C

2021-07-12 22:54:02    分类:技术分享    c++   c   struct

使用 CRTP 和多重继承消除冗余(Eliminate redundancy with CRTP and multiple inheritance)
问题 这个问题是针对 C++03 的,而不是针对 C++11 的。 我有一个案例,我使用具有多重继承的 CRTP,我很想知道是否有办法删除在指定下面的B类型时创建的冗余。 #include "boost/typeof/typeof.hpp" #include "boost/units/detail/utility.hpp" #include <iostream> #include <string> struct One{}; struct Two{}; template<typename T> struct Type { static std::string name(void) { return boost::units::detail::demangle(typeid(T).name()); } }; template<typename T1, typename T2> struct A { typedef A<T1, T2> Self; A() { std::cout << Type<Self>::name() << std::endl; } }; template<typename T1, typename T2, typename T3> struct B : public A<One, B<T1, T2, T3> >, // The B<T1, T2, T3> here

2021-09-21 16:33:25    分类:技术分享    c++   multiple-inheritance   c++03   crtp

警告:由于数据类型范围有限导致崩溃,比较始终为真(warning: comparison is always true due to limited range of data type causes crash)
问题 I have a warning that I am unable to find the cause of. I am following instructional code in a text on Cocoa programming that implements a document based image slide show. This warning causes a while loop to be executed more than the correct number of times which causes the program to crash. The code downloaded from the author's website does not have this problem. I assumed it was a simple matter of a typo in my version but carefully reading both versions of code I was unable to come across any differences. I then systematically replaced every .h, .m, .xib and other resource file in my

2021-10-31 04:57:07    分类:技术分享    cocoa   compiler-warnings   xcode3.2   pbxproj

#pragma pack、模板类型定义和结构对齐(#pragma pack, template typedefs, and struct alignment)
问题 使用 Visual Studio 或 gcc,如果我有 #pragma pack(push, 16) typedef std::map<uint32_t, uint32_t> MyIntMap; #pragma pack(pop) 后来: #pragma pack(push, 8) MyIntMap thisInstance; #pragma pack(pop) thisInstance 的结构对齐方式是什么? 也就是说,对于 typedef 的模板类,pragma pack 是在 typedef 的位置还是在变量定义的位置生效? 如果是后者,获得跨文件一致对齐的类型有什么好的解决方法? 回答1 在您的代码中, #pragma pack将不起作用。 它只在围绕结构或类的定义生效时执行任何操作,而不是围绕 typedef 或任何其他内容。 它对变量定义也没有任何影响。 您可以在此处查看用法:http://msdn.microsoft.com/en-us/library/2e70t5y1(v=VS.100).aspx 具体来说: pack 在看到 pragma 后的第一个 struct、union 或 class 声明时生效。 pack 对定义没有影响。

2021-10-31 09:22:25    分类:技术分享    c++   templates   visual-c++   gcc   memory-alignment

屏幕颜色反转在 OS X 中如何工作?(How does on-screen color inversion work in OS X?)
问题 这是 OS X 内置的颜色反转功能可以将您的屏幕变成: 它可以反转所有颜色,将它们变成灰度,调整对比度。 现在我想构建自己的实现,因此需要专业人士的建议。 无法捕捉倒置屏幕让我认为倒置是一种调整层,它位于所有窗口之上,根本不暴露于交互事件。 是这样吗? 它是通过 OpenGL 库完成的吗? 我不研究实际的编码帮助,而是研究解决问题的设计/方法。 在我的目标应用程序中,我需要定义输出颜色渐变并应用颜色转换规则(输入 => 输出)。 提前致谢。 回答1 Mac OS 进行颜色反转的方式(可能)是通过使用 Quartz Display Services 来修改显卡的 Gamma 表。 显卡有两个这样的表,用于在合成到最终帧缓冲区后修改颜色输出。 其中之一可以由应用程序修改,以改变屏幕显示任何 RGB 值的方式。 这是反转显示的代码: //ApplicationServices includes CoreGraphics #import <ApplicationServices/ApplicationServices.h> int main(int argc, const char * argv[]) { CGGammaValue table[] = {1, 0}; CGSetDisplayTransferByTable(CGMainDisplayID(), sizeof(table

2021-06-09 12:32:55    分类:技术分享    objective-c   cocoa   colortransform

什么时候使用包含守卫?(When to use include guards?)
问题 我知道在头文件中使用包含保护是为了防止某些东西被定义两次。 不过,使用此代码示例完全没问题: foo.c #include <stdio.h> #include <string.h> #include "bar.h" int main() { printf("%d", strlen("Test String")); somefunc("Some test string..."); return 0; } 酒吧.h #ifndef BAR_H_INCLUDED #define BAR_H_INCLUDED void somefunc(char str[]); #endif 酒吧 #include <stdio.h> #include <string.h> #include "bar.h" void somefunc(char str[]) { printf("Some string length function: %d", strlen(str)); } 上面的代码片段是用gcc -Wall foo.c bar.c -o foo编译的,没有错误。 但是, <stdio.h>和<string.h>都包含在没有包含保护的情况下。 当我将 bar.h 剥离到单个语句void somefunc(char str[]);时,仍然没有错误void somefunc(char str[])

2021-10-16 11:56:51    分类:技术分享    c   macros   c-preprocessor   header-files   include-guards

This template code will not compile. Any ideas? [closed]
This question is unlikely to help any future visitors; it is only relevant to a small geographic area, a specific moment in time, or an extraordinarily narrow situation that is not generally applicable to the worldwide audience of the internet. For help making this question more broadly applicable, visit the help center. Closed 9 years ago. I got this code from rhalbersma, but it does not compile in VC 2010. I don't know what I'm doing wrong. template<typename Derived> struct enable_crtp { private: // typedefs typedef enable_crtp Base; public: // casting "down" the inheritance hierarchy

2021-11-13 18:28:58    分类:问答    c++   templates

带有动画的UITableview reloaddata(UITableview reloaddata with animation)
问题 我有一个UITableView ,它是从数组和一个下拉列表中填充的。 如果我选择下拉列表的任何行,则将使用新值插入数组,并且应该重新加载tableview。 如何使用新的数组内容为tableview设置动画? 像我这样的动画要一排一排地显示。 我尝试过这种方法 - (void)reloadRowsAtIndexPaths:(NSArray )indexPaths withRowAnimation:(UITableViewRowAnimation)animation { NSIndexPath rowToReload = [NSIndexPath indexPathForRow:[names count] inSection:0]; NSArray* rowsToReload = [NSArray arrayWithObjects:rowToReload, nil]; [tableDetails reloadRowsAtIndexPaths:rowsToReload withRowAnimation:UITableViewRowAnimationNone]; } 回答1 要添加到正确的答案,如果您想重新加载UITableView所有部分,则需要执行以下操作: 对象 NSRange range = NSMakeRange(0, [self

2021-04-24 21:37:40    分类:技术分享    ios   uitableview   reloaddata

结构体(基础知识)
结构声明: 方式: struct tag { member-list } variable-list; 例子: struct { int a; char b; float c; } x; 声明了一个名叫x的变量,包含三个成员:一个整数、一个字符、一个浮点数。 struct { int a; char b; float c; } y[2], *z; 创建了y和z,y是一个数组,包含20个结构。z是一个指针,指向这个类型结构。 警告:这两个声明被编译器当作两种截然不同的类型,即使它们的成员列表完全相同。因此,变量y和z的类型和x的类型不同,所以下面这条语句是非法的。 z = &x; 标签(tag)字 段允许为成员列表提供-一个名字,这样它就可以在后续的声明中使用。标签允许多个声明使用同一个成员列表,并且创建同-种类型的结构。这里有个例子。 struct SIMPLE { int a; char b; float c; }; 这个声明把标签SIMPLE和这个成员列表联系在一起。该声明并没有提供变量列表,所以它并未创建任何变量。标签标识了一种模式,用于声明未来的变量,但无论标签还是模式本身都不是变量。 struct SIMPLE x; struct SIMPLE y[20], *z; 这些声明使用标签来创建变量。它们创建和最初两个例子一样的变量,但存在一个重要的区别一现在x

2021-12-03 03:08:07    分类:博客    

C 中的线程安全(Thread Safety in C)
问题 想象我用 C 编写了一个库。此外,想象这个库在多线程环境中使用。 我如何使它线程安全? 更具体地说:我如何确保某些功能一次仅由一个线程执行? 例如,与 Java 或 C# 不同,C 没有处理线程/锁/等的方法,C 标准库也没有。 我知道,操作系统支持线程,但是使用它们的 api 会极大地限制我的库的兼容性。 我有哪些可能性可以使我的库尽可能兼容/便携? (例如,依赖 OpenMP 或 Posix 线程以使其与至少所有类 Unix 操作系统兼容?) 回答1 您可以使用 #ifdef 创建包装器。 这真的是你能做的最好的。 (或者您可以使用第三方库来执行此操作)。 作为 windows 和 linux 的示例,我将展示我是如何做到的。 它是在 C++ 中而不是在 C 中,但它只是一个例子: #ifdef WIN32 typedef HANDLE thread_t; typedef unsigned ThreadEntryFunction; #define thread __declspec(thread) class Mutex : NoCopyAssign { public: Mutex() { InitializeCriticalSection(&mActual); } ~Mutex() { DeleteCriticalSection(&mActual); } void

2021-06-11 06:17:35    分类:技术分享    c   multithreading   thread-safety

什么是图
目录一、图引入二、什么是图(Graph)三、抽象数据类型定义四、常见术语五、怎么在程序中表示一个图六、邻接矩阵6.3.1 c表示6.3.2 Python表示6.1 邻接矩阵的优点6.2 邻接矩阵的缺点6.3 邻接矩阵的代码表示七、邻接表7.2.1 c表示7.3.2 Python表示7.1 邻接表的优点7.2 邻接表的缺点7.3 邻接表的代码表示更新、更全的《数据结构与算法》的更新网站,更有python、go、人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11407287.html一、图引入相信很多同学都听说过六度空间理论(SixDegress of Separation):只要通过6个人的关系网,你就能够认识全世界所有的人。这个理论和我们接下来要讲的图非常相似。从上图中,我们可以看出,如果你认识6个人,是很有可能认识其他所有人的。但是,对于全球的30亿的互联网人来说,你真的可以全部认识吗?大多数同学此刻一定是定神一想,这还用问?你是傻子吗?这一定不可能呀。但是对于这个问题,我们可以用我们未来学习的图的知识解决,啪啪打脸可真不好受,哈哈哈!除了上述问题,对于下图,我再来提出两个问题:从陈家庄到张家村,怎么走最快呢?怎么修公路使得村村通的花费最少呢?有些同学说了,这还不简单,让我用我的火眼金睛数一数。但是对于下述这张图呢?算了

2021-04-19 21:51:15    分类:博客    

C++教程第三部分
一.前言本文将使用最快的方法过完C++。由于是快速阅览,本文不会描述过多的详细知识,如何深入还需要各位努力;不过学习过了一遍内容后,再学习C++也会较为容易。更多详细进阶教程可以关注微信公众号 “C和C加加” 回复“ZXC”即可免费获取二.自定义数据类型1.结构体结构体可以包含不同数据类型的结构。定义结构体的一般形式结构体变量名的定义和初始化:结构体变量的使用:具有相同类型的结构体变量可以进行赋值运算,但是不能输入输出对结构体变量的成员引用:结构体变量名.成员名指向结构体的指针变量引用格式:指针变量名->成员名;结构体数组的定义,初始化和使用与结构体变量、基本类型数组相似结构体作为函数传递有三种:值传递,引用传递,指针传递2.结构体大小和字节对齐现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐.为什么需要字节对齐?各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方

2021-06-02 10:19:06    分类:博客    c语言   c++   编程语言

为什么我不能从C ++的int继承?(Why can't I inherit from int in C++?)
问题 我很希望能够做到这一点: class myInt : public int { }; 我为什么不能 我为什么要呢? 更强的打字。 例如,我可以定义两个类intA和intB ,它们使我可以进行intA + intA或intB + intB ,但不能进行intA + intB 。 “整数不是阶级。” 所以呢? “整数没有任何成员数据。” 是的,他们有,它们有32位或其他。 “整数没有任何成员函数。” 好吧,他们有一堆运算符,例如+和- 。 回答1 尼尔的评论很准确。 Bjarne提到考虑并拒绝这种确切的可能性1 : 初始化语法过去对于内置类型是非法的。 为此,我介绍了内置类型具有构造函数和析构函数的概念。 例如: int a(1); // pre-2.1 error, now initializes a to 1 我考虑扩展此概念,以允许从内置类派生并为内置类型显式声明内置运算符。 但是,我克制住自己。 与拥有int成员相比,允许从int派生实际上并没有给C ++程序员带来任何新的东西。 这主要是因为int没有任何虚拟函数可以覆盖派生类。 但是,更严重的是,C转换规则是如此混乱,以至于假装int , short等行为良好的普通类是行不通的。 它们要么是C兼容的,要么它们服从相对良好的类的C ++规则,但不能同时使用这两种规则。 就评论而言,性能证明不将int设为类,这是

2021-04-30 06:24:23    分类:技术分享    c++   inheritance   integer   language-design   strong-typing

Cocos2dx-lua之CCScheduler源码分析
Cocos2dx-lua的CCScheduler源码分析 本文通过cocos2dx的CCScheduler源码分析,介绍了CCScheduler是什么,以及在cocos2d-lua如何使用CCScheduler。 文章目录 Cocos2dx-lua的CCScheduler源码分析前言一、CCScheduler的分类1.每帧调用(update selector)2.自定义定时器(custom selector) 二、Lua中如何使用?1.每帧调用(update selector)的使用2.自定义定时器(custom selector)的使用 总结 前言 CCScheduler是什么?CCScheduler是可以理解成一个定时器,周期性执行一次任务(回调函数)。Cocos2d官方不建议游戏逻辑中使用系统的Timer。如果使用系统的定时器,可能出现游戏逻辑混乱,达不到预期效果。可以理成CCScheduler缺乏时间精度,系统定时器比较精确计时。 提示:以下是本篇文章正文内容,下面案例可供参考 一、CCScheduler的分类 CCScheduler一共有两种类型的回调函数callbacks (selectors),一种是每帧调用(update selector)类型,这种回调函数用户可以自定义执行回调函数的优先级(priority);另外一种就是用户自定义回调函数(custom

2021-11-25 03:15:06    分类:博客    

在iOS上模仿截图flash动画(Imitating screenshot flash animation on iOS)
问题 我正在寻找一种复制“闪烁”动画的方法,即在按下 home+lock 时播放。 有谁知道这个动画是否以某种方式可用? 回答1 在 iOS 设备上,当您按下 home + lock 并且屏幕闪烁白色时,您会截取屏幕截图。 你是说这个效果吗? 如果是这样,试试这个: 将具有白色背景颜色的UIView添加到视图层次结构中,使其覆盖整个屏幕。 然后,启动一个动画,将该视图的不透明度淡化为零。 完成后,从其父视图中删除视图: [UIView animateWithDuration: 0.5 animations: ^{ whiteView.alpha = 0.0; } completion: ^(BOOL finished) { [whiteView removeFromSuperview]; } ]; 回答2 尝试: [UIView animateWithDuration:1 animations:^{ self.view.backgroundColor = [UIColor blackColor]; for (UIView *view2 in self.view.subviews) { view2.backgroundColor = [UIColor blackColor]; } }]; [UIView animateWithDuration:1 animations:^{ self

2022-01-11 22:19:45    分类:技术分享    ios

嵌入式软件工程师(6-15k)笔试面试经验分享(应届毕业生)
先看一下工资情况: 一、笔试部分 (一)技术测试题(拍了部分内容) (二)人格测试题 二、面试部分 (一)技术面试题 面试百问: 问:你自己做的一个项目,问你在做项目的过程中遇到的困难以及怎么解决 问:你项目中用到的数据结构,单片机项目我只用了数组,面试官没有继续 问:单片机的资源大小。 问:通信方式:IIc SPI ,时序原理以及区别 问:网络协议:建立连接的步骤 以及用的函数 问:怎么同时接入多个客户端 问:进程与线程的区别 问:进程的通信方式 问:使用共享内存的注意事项 问:如果一个进程长时间占用共享内存 问:有没有具体写的程序或者项目 问:为什么要学习Linux系统 问:有没有移植过Linux系统 问:移植中的问题以及解决方法 问:如果在公司做的项目要用其他语言去编写愿不愿意学 问:你了解过我们单位吗? 问:你倾向于做公司哪一类项目 答:智能硬件 问:你觉得智能硬件用到了什么关键技术 答:(这个问题有点回答不好,不理解) 问:对WiFi与蓝牙了解多少,觉得这些技术 答:用过esp8266以及蓝牙模块,并用这些实现了一些功能 问:电子大赛3个人你是组长吗?你觉得团队管理方面有什么要注意的 问:偏向于技术线还是管理线? 答:技术线,我技术方面更有优势 问:你觉得是上级分配任务还是自己做一些任务? 问:职业规划: 答:先学习,然后深入研究 问:公司的哪些方面想学习 问

2021-12-04 01:11:23    分类:博客    

Eliminate redundancy with CRTP and multiple inheritance
This question is for C++03, not C++11. I have a case where I am using CRTP with multiple inheritance, and I am curious to know if there is a way to remove the redundancy that is created when specifying the type of B below. #include "boost/typeof/typeof.hpp" #include "boost/units/detail/utility.hpp" #include <iostream> #include <string> struct One{}; struct Two{}; template<typename T> struct Type { static std::string name(void) { return boost::units::detail::demangle(typeid(T).name()); } }; template<typename T1, typename T2> struct A { typedef A<T1, T2> Self; A() { std::cout << Type<Self>::name

2021-09-03 19:28:08    分类:问答    c++   multiple-inheritance   c++03   crtp

在Objective-C中声明和检查/比较(位掩码)枚举(Declaring and checking/comparing (bitmask-)enums in Objective-C)
问题 您知道在Cocoa中有这个东西,例如,您可以创建一个UIView并执行以下操作: view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 我有一个带有多个状态的自定义UIView ,我在这样的enum定义了这样的状态: enum DownloadViewStatus { FileNotDownloaded, FileDownloading, FileDownloaded }; 对于每个创建的子视图,我设置其tag : subview1.tag = FileNotDownloaded; 然后,我有一个用于视图状态的自定义设置器,它可以执行以下操作: for (UIView *subview in self.subviews) { if (subview.tag == viewStatus) subview.hidden = NO; else subview.hidden = YES; } 但是我想做的是允许这样做: subview1.tag = FileNotDownloaded | FileDownloaded; 因此,我的subview1以我的视图的两种状态显示。 目前,它在这两个州中均未显示| 运算符似乎将两个枚举值相加。 有没有办法做到这一点?

2021-04-26 17:18:49    分类:技术分享    objective-c   c   cocoa   enums   bitmask

Can memcpy be used for type punning?
This is a quote from the C11 Standard: 6.5 Expressions ... 6 The effective type of an object for an access to its stored value is the declared type of the object, if any. If a value is stored into an object having no declared type through an lvalue having a type that is not a character type, then the type of the lvalue becomes the effective type of the object for that access and for subsequent accesses that do not modify the stored value. If a value is copied into an object having no declared type using memcpy or memmove, or is copied as an array of character type, then the effective type of

2022-02-18 14:36:59    分类:问答    c   type-conversion   language-lawyer

如何摆脱带有精神的令牌中的转义字符:: lex?(how to get rid of escape character in a token with spirit::lex?)
问题 我想标记我自己的 SQL 语法扩展。 这涉及识别双引号字符串中的转义双引号。 例如,在 MySQL 中,这两个字符串标记是等价的: """" (第二个双引号充当转义字符)和'"' 。我尝试了不同的方法,但我一直在解决如何替换标记的值。 #include <boost/spirit/include/lex_lexertl.hpp> namespace lex = boost::spirit::lex; template <typename Lexer> struct sql_tokens : lex::lexer<Lexer> { sql_tokens() { string_quote_double = "\\\""; // '"' this->self("INITIAL") = string_quote_double [ lex::_state = "STRING_DOUBLE" ] // how to also ignore + ctx.more()? | ... ; this->self("STRING_DOUBLE") = lex::token_def<>("[^\\\"]*") // action: ignore + ctx.more() | lex::token_def<>("\\\"\\\"") // how to set token value to '"'

2021-07-12 12:20:46    分类:技术分享    c++   boost-spirit   boost-spirit-lex

用结构理解 typedef [重复](Understanding typedef with struct [duplicate])
问题 这个问题在这里已经有了答案: typedef struct vs struct 定义 [重复] (12 个回答) 5年前关闭。 我很难理解这个代码示例: typedef struct node { int data; struct node * next; } node; typedef node * nodepointer; 所以,我们正在使用 typedef 构建结构节点......我假设我们这样做是为了在不需要“struct”关键字的情况下初始化结构。 我想问一下为什么在结构定义中我们两次使用了名称“节点”(在开始和结束时)。 其次什么typedef node * nodepointer; 指着。 在这种情况下是否有必要使用 typedef? 是这个表达式node * nodepointer; 不相等? 回答1 首先,让我们在这里明确一点: typedef不是变量的声明。 它只是将新类型名称别名为现有类型说明符。 typedef <type specifier> new_type_name; 所以这里发生的事情对于未经训练的人来说肯定是骗人的。 struct node本身是一个名为node的struct具有两个属性int data和一个struct node *next 。 我会去更多的进入next瞬间,但到目前为止,这是很简单的。 然后

2021-11-30 04:21:54    分类:技术分享    c   struct   typedef

作为C结构成员的函数指针(Function pointer as a member of a C struct)
问题 我有一个结构如下,带有指向“ length”的函数的指针,该函数将返回chars成员的长度。 typedef struct pstring_t { char * chars; int (* length)(); } PString; 我有一个函数可以将指针的长度从指针返回到PString: int length(PString * self) { return strlen(self->chars); } 我有一个函数initializeString()返回一个指向PString的指针: PString * initializeString() { PString *str; str->length = &length; return str; } 很明显,我的指针在这里做错了很多,因为str->length = &length行会在调试器中导致EXC_BAD_ACCESS信号,就像返回return strlen(self-> chars)一样。 有人对此问题有见识吗? 我特别希望能够有initializeString()函数返回指向PString的指针,以及使函数使用指向PString的指针作为输入的length函数。 这只是在C语言中实现基本的面向对象系统的实验,但是我没有很多直接处理指针的经验。 感谢你给与我的帮助。 回答1 分配内存以容纳字符。 #include

2021-04-23 13:39:42    分类:技术分享    c   function   pointers

结构体对齐
C程序结构体对齐 关于结构体对齐我把我的理解写下来; 结构体对齐的步骤: 1,结构体各个成员对齐; 2,结构体圆整 首先要了解几个概念: 1, 指定对齐值: 指定对齐值是由宏#pragma pack (N)指定的值,里面的N必须是2的幂次方,如1,2,4,8,16等。如果没有通过#pragma pack宏那么在32位的Linux主机上默认指定对齐值为4,64位的Linux主机上默认指定对齐值为8,ARM CPU默认指定对齐值为8; 在计算机内存中,结构体变量的存储通常是按字长对齐的。 例: 32位系统中,变量就按照4字节对齐; 64位系统中,变量就按照8字节对齐; 4字节对齐和8字节对齐分别指的是他们的系统的默认对齐值; 2, int , char , short,在计算机的内存存储中分别占4字节 ,1字节 , 2字节; 它所占内存大小的值叫自身对齐值,就是结构体变量里每个成员的自身大小; 3, 有效对齐值: 结构体成员自身对齐时有效对齐值为自身对齐值与指定对齐值中较小的一个, {自身对齐值,指定对齐值}取较小的一个 4 结构体圆整时,为所有成员中自身对齐值最大的与指定对齐值较小的一个的整数倍 {所有成员中自身对齐值最大的一个,指定对齐值} 取较小的一个 下面我们举一个例子: (32位系统默认对齐值为4) typedef struct _st_struct1 typedef

2021-12-07 05:29:11    分类:博客    

结构指针兼容性(Struct pointer compatibility)
问题 假设我们有两个结构体: typedef struct Struct1 { short a_short; int id; } Struct1; typedef struct Struct2 { short a_short; int id; short another_short; } Struct2; 从Struct2 *到Struct1 *是否安全? ANSI 规范对此有何规定? 我知道一些编译器可以选择重新排序结构字段以优化内存使用,这可能会使两个结构不兼容。 无论编译器标志如何,有什么方法可以确保此代码有效? 谢谢! 回答1 据我所知,这是安全的。 但如果可能的话,这样做要好得多: typedef struct { Struct1 struct1; short another_short; } Struct2; 然后您甚至告诉编译器Struct2以Struct2的实例Struct1 ,并且由于指向结构的指针始终指向其第一个成员,因此您可以安全地将Struct2 *视为Struct1 * 。 回答2 struct 指针类型在 C 中始终具有相同的表示形式。 (C99,6.2.5p27)“所有指向结构类型的指针都应具有相同的表示和对齐要求。” 结构类型中的成员在 C 中总是按顺序排列的。 (C99, 6.7.2.1p5) “结构是由成员序列组成的类型,其存储按有序序列分配”

2021-12-08 08:56:09    分类:技术分享    c   casting   struct   ansi

将参数从 Python C API 中的子类型传递给 tp_new 和 tp_init(Passing arguments to tp_new and tp_init from subtypes in Python C API)
问题 我最初在 Python capi-sig 列表上问了这个问题:How to pass arguments to tp_new and tp_init from subtypes? 我正在阅读关于子类型的 Python PEP-253,并且有很多关于如何构造类型、调用tp_new和tp_init插槽等的好建议。 但是,它缺少将参数从 sub 传递到 super 类型的重要说明。 根据注释,PEP-253 似乎尚未完成: (XXX 应该有一两段关于这里传递的参数。) 所以,我试图从 Python 类的子类型中推断出一些众所周知的策略,尤其是每个级别剥离参数的技术等。 我正在寻找技术来实现与此类似的效果,但使用纯Python C API (3.x): class Shape: def __init__(self, shapename, **kwds): self.shapename = shapename super().__init__(**kwds) class ColoredShape(Shape): def __init__(self, color, **kwds): self.color = color super().__init__(**kwds) Python C API 中的等价物是什么? 如何处理类似的情况,但特定于派生类的参数以不同的顺序预期? 它是在

2021-06-03 05:44:27    分类:技术分享    python   python-c-api

What is the effect of typedef'ing a struct to itself? [duplicate]
This question already has answers here: Difference between 'struct' and 'typedef struct' in C++? (8 answers) Closed 7 years ago. I've seen this code written at the top of an API: typedef struct SYSTEM SYSTEM; The type SYSTEM was previously undefined. Does anyone know what this does? What does the compiler think a SYSTEM after this line? Thanks for the answers! My question is that SYSTEM was not previously defined in the file, so I have no idea what it is. For example, that line will compile by itself, but struct SYSTEM was not defined anywhere.

2021-06-26 06:41:50    分类:问答    c++   c   struct

STL中真正的双端队列是什么?(What really is a deque in STL?)
问题 我正在查看STL容器,并试图弄清它们的真正含义(即所使用的数据结构),但双端队列使我停了下来:我认为起初它是一个双链表,它允许从两端插入和删除固定时间,但是操作员[]承诺要在固定时间内完成操作,这让我感到困扰。 在链表中,任意访问应为O(n),对吗? 如果它是一个动态数组,它如何在恒定时间内添加元素? 应该提到的是,重新分配可能会发生,并且O(1)是摊销成本,就像矢量一样。 因此,我想知道这种结构允许在恒定时间内进行任意访问,而同时又无需将其移至更大的新位置。 回答1 一个双端队列在某种程度上是递归定义的:它在内部维护一个固定大小的块的双端队列。 每个块都是一个向量,块的队列(下图中的“映射”)本身也是一个向量。 在CodeProject上对性能特征以及如何将其与vector进行了很好的分析。 GCC标准库实现在内部使用T**表示地图。 每个数据块都是一个T* ,它分配有一定的固定大小__deque_buf_size (取决于sizeof(T) )。 回答2 想象它是向量的向量。 只有它们不是标准的std::vector 。 外部向量包含指向内部向量的指针。 当通过重新分配更改其容量时,而不是像std::vector那样将所有空白空间分配到末尾,而是将空白空间在向量的开始和结尾处等分。 这允许此向量上的push_front和push_back都在O(1)摊销时间内发生。

2021-04-03 22:35:40    分类:技术分享    c++   stl   deque

是一个 struct {…}; 一个类型或一个未命名的变量?(Is a struct {…}; a type or an unnamed variable?)
问题 以下是文件范围内的类型声明还是未命名的变量? struct student_s { char* name; int age; double height; struct student_s* next; }; 如果是类型定义,那么和以下有什么区别: typedef struct student_s { char* name; int age; double height; struct student_s* next; }; ? (背景:请参阅我在将变量从全局变量更改为本地变量 - C 中的答案,我相信第一个引入了一个未命名的变量,然后编译器将其优化掉。) 注意:该问题已被标记为可能的重复结构成员标识符放在什么范围内? 但我相信我不是在问关于成员范围的问题,而是关于声明实际创建的内容。 然而。 C++ 中“struct”和“typedef struct”的区别的答案? 请解释我的问题。 回答1 根据C标准,结构声明的形式如下 struct student_s { char* name; int age; double height; struct student_s* next; }; 是类型的声明。 引用C11章节 §6.7.2.1 struct-or-union-specifier 中 struct-declaration-list 的存在声明了翻译单元内的新类型。

2021-06-22 11:11:02    分类:技术分享    c   struct

自我参照结构定义?(self referential struct definition?)
问题 我已经很长时间没有写C了,所以我不确定如何去做这些递归的事情……我希望每个单元格都包含另一个单元格,但是我却遇到了一个错误。 “字段'child'的行类型不完整”。 这是怎么回事? typedef struct Cell { int isParent; Cell child; } Cell; 回答1 显然,一个单元不能包含另一个单元,因为它变成了永无止境的递归。 但是,一个信元可以包含一个指向另一个信元的指针。 typedef struct Cell { bool isParent; struct Cell* child; } Cell; 回答2 在C语言中,不能随同结构本身一起引用正在创建的typedef。 您必须使用结构名称,如以下测试程序中所示: #include <stdio.h> #include <stdlib.h> typedef struct Cell { int cellSeq; struct Cell* next; /* 'tCell *next' will not work here */ } tCell; int main(void) { int i; tCell *curr; tCell *first; tCell *last; /* Construct linked list, 100 down to 80. */ first = malloc

2021-04-03 21:21:03    分类:技术分享    c   recursion   struct   typedef

SKEmitterNodeparticleAction 不工作 iOS9 Beta(SKEmitterNode particleAction not working iOS9 Beta)
问题 我正在 iOS9 Beta 4 中测试我的应用程序,并发现许多曾经在 iOS8 中工作的代码不再按预期执行。 另一个例子是 SpriteKit 的 SKEmitterNode“particleAction”属性。 以下代码适用于 iOS8,但不适用于 iOS9: // create the particle movement action SKAction *move = [SKAction moveByX:100 y:100 duration:5]; // also, I've tested several other SKActions, such as scaleBy, fade, rotate, to no effect here // create a target node and add to the SKScene SKNode *targetNode = [SKNode node]; targetNode.position = origin; [mySKSceneNode addChild:targetNode]; // add an emitter node that has a target and an SKAction SKEmitterNode *flameTrail = [NSKeyedUnarchiver

2021-11-29 21:04:28    分类:技术分享    ios   iphone   ipad   sprite-kit   ios9

typedef和#define的用法、区别,以及陷阱
typedef和#define的用法、区别,以及陷阱 一、typedef的用法二、#define的用法三、typedef与#define的区别四、typedef的用途五、typedef的陷阱   在C语言编程中,typedef 和 #define是最常用语句,可能很多工作过两三年的工程师都没有去深究过它们的一些用法和区别。 一、typedef的用法   在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,比如: typedef int INT; typedef (int*) pINT; typedef unsigned int uint32_t   typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“非直观性”等缺点。 二、#define的用法   #define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善、背后一长串”的宏,它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了,但也因此难以发现潜在的错误及其它代码维护问题,比如: #define INT int #define TRUE 1 #define Add(a,b) ((a)+(b)); #define Loop_10 for (int i=0; i<10; i++)   在Scott

2021-11-25 12:18:28    分类:博客    

我可以在C ++中实现自治的`self`成员类型吗?(Can I implement an autonomous `self` member type in C++?)
问题 C ++缺少与PHP的self关键字等效的功能,该关键字的求值结果为封闭类的类型。 在每个类别的基础上伪造它很容易: struct Foo { typedef Foo self; }; 但是我不得不再次写Foo 。 也许有一天我会弄错这个错误,并导致一个无声的错误。 我可以结合使用decltype和friends来“自动”进行此工作吗? 我已经尝试了以下方法,但是在那个地方this是无效的: struct Foo { typedef decltype(*this) self; }; // main.cpp:3:22: error: invalid use of 'this' at top level // typedef decltype(*this) self; (我不必担心static的等效项,它的作用相同,但绑定较晚。) 回答1 以下是您无需重复Foo类型即可做到的方法: template <typename...Ts> class Self; template <typename X, typename...Ts> class Self<X,Ts...> : public Ts... { protected: typedef X self; }; #define WITH_SELF(X) X : public Self<X> #define WITH_SELF

2021-03-28 23:54:07    分类:技术分享    c++   c++11

使用 vs. typedef - 是否存在微妙的、鲜为人知的差异?(using vs. typedef - is there a subtle, lesser known difference?)
问题 背景 大家一致认为 using <typedef-name> = <type>; 相当于 typedef <type> <typedef-name>; 并且由于各种原因,前者优于后者(参见 Scott Meyers,Effective Modern C++ 和有关 stackoverflow 的各种相关问题)。 这是由 [dcl.typedef] 支持的: typedef-name 也可以通过别名声明引入。 using 关键字后面的标识符成为 typedef-name,标识符后面的可选属性说明符序列属于该 typedef-name。 这样的 typedef-name 具有与 typedef 说明符引入的语义相同的语义。 但是,请考虑声明,例如 typedef struct { int val; } A; 对于这种情况,[dcl.typedef] 指定: 如果 typedef 声明定义了一个未命名的类(或枚举),则声明声明为该类类型(或枚举类型)的第一个 typedef-name 仅用于表示用于链接目的的类类型(或枚举类型)(3.5 )。 引用的第 3.5 节 [basic.link] 说 如果名称是 [...] 在 typedef 声明中定义的未命名类的名称,其中该类具有用于链接的 typedef 名称目的 [...] 假设上面的 typedef 声明是在全局命名空间中完成的

2021-10-21 12:30:41    分类:技术分享    c++11   gcc   c++14   language-lawyer   clang++

游戏对象互相交谈[关闭](Game Objects Talking To Each Other [closed])
问题 关闭。 这个问题是基于意见的。 它目前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑这篇文章用事实和引文来回答问题。 2年前关闭。 改进这个问题 处理对象并使它们相互交谈的好方法是什么? 到目前为止,我所有的游戏爱好/学生都很小,所以这个问题通常以一种相当丑陋的方式解决,这导致紧密集成和循环依赖。 这对于我正在做的项目规模来说很好。 然而,我的项目在规模和复杂性上变得越来越大,现在我想开始重用代码,让我的头脑变得更简单。 我遇到的主要问题通常是Player需要了解Map , Enemy也是如此,这通常会导致设置大量指针并具有大量依赖项,这很快就会变得一团糟。 我已经按照消息样式系统的思路进行了思考。 但我真的看不出这是如何减少依赖性的,因为我仍然会到处发送指针。 PS:我想这之前已经讨论过,但我不知道它叫什么,只是我的需要。 回答1 编辑:下面我描述了一个我反复使用的基本事件消息传递系统。 我突然想到这两个学校项目都是开源的,而且是在网络上。 您可以在 http://sourceforge.net/projects/bpfat/ 找到此消息传递系统的第二个版本(以及更多版本)。享受并阅读下面的系统更全面的描述! 我编写了一个通用的消息传递系统,并将其引入到一些已在 PSP 上发布的游戏以及一些企业级应用程序软件中。 消息传递系统的重点是仅传递处理消息或事件所需的数据

2021-10-16 15:34:07    分类:技术分享    c++   design-patterns   circular-dependency   tightly-coupled-code

C++进阶——STL源码之迭代器(iterators)
STL迭代器 在 STL 编程中,容器和算法是独立设计的,即数据结构和算法是独立设计的,连接容器和算法的桥梁就是迭代器了: 迭代器是一种行为类似指针的对象,而指针的各种行为中最常见也最重要的使用是:内容提领 和成员访问,所以迭代器会对operator* 和 operator-> 进行重载工作,首先来看下list容器的迭代器实现: template<typename _Tp> struct _List_iterator { typedef _List_iterator<_Tp> _Self; typedef _List_node<_Tp> _Node; typedef ptrdiff_t difference_type; typedef std::bidirectional_iterator_tag iterator_category; typedef _Tp value_type; typedef _Tp* pointer; typedef _Tp& reference; _List_iterator() _GLIBCXX_NOEXCEPT : _M_node() { } explicit _List_iterator(__detail::_List_node_base* __x) _GLIBCXX_NOEXCEPT : _M_node(__x) { } _Self _M

2021-11-21 21:21:36    分类:博客    

C++中typedef和define的区别
typedef和#define的用法与区别 一、typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: typedef int INT; typedef int ARRAY[10]; typedef (int*) pINT; typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“非直观性”等缺点。 二、#define的用法 #define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善、背后一长串”的宏,它本身并不在编 译过程中进行,而是在这之前(预处理过程)就已经完成了,但也因此难以发现潜在的错误及其它代码维护问题,它的实例像: #define INT int #define TRUE 1 #define Add(a,b) ((a)+(b)); #define Loop_10 for (int i=0; i<10; i++) 在Scott Meyer的Effective C++一书的条款1中有关于#define语句弊端的分析,以及好的替代方法,大家可参看。 三、typedef与#define的区别 从以上的概念便也能基本清楚,typedef只是为了增加可读性而为标识符另起的新名称(仅仅只是个别名),而

2021-04-20 06:38:10    分类:博客    

我需要#undef 本地#define 吗? 有本地定义这样的东西吗?(Do I need to #undef a local #define? Is there such a thing as a local define?)
问题 有时为了更容易编写和阅读,我会在函数中编写一些本地#define宏(for example, #define O_REAL Ogre::Real) 。 我是否需要#undef本地#define以确保它保留在某个代码块中? 或者当它超出范围时它会自动#undef吗? 它甚至有范围的概念吗? 我不确定#define在这种情况下如何工作。 现在,我当然已经对代码进行了试验并得出了某些结论,但由于我不确定,我需要一些专家意见/建议。 回答1 #define不考虑任何 C++ 范围。 没有“本地” #define这样的东西。 它将一直有效,直到它被#undef -ed。 预处理器的宏机制就像大多数文本编辑器中的“查找和替换”功能一样; 它不尊重文件的内容。 换句话说,如果您希望#define在某个代码块中是本地的,则必须在该块的末尾#undef它,因为宏不“理解”范围。 事实上,这是不鼓励使用宏的最大原因之一,除非它们在 C++ 中是绝对必要的。 这就是为什么宏名称通常以UPPER_CASE输入以表明它实际上是一个宏。 实际上有很多针对您的特定情况的无宏解决方案。 考虑以下: namespace ReallyLongOuterNamespace { namespace ReallyLongInnerNamespace { class Foo {}; void Bar() {} }; }

2021-12-23 05:08:40    分类:技术分享    c++   c-preprocessor

C语言typedef关键字及其使用
在C语言中有一个typedef关键字,其用来定义用户自定义类型。当然,并不是真的创造了一种数据类型,而是给已有的或者符合型的以及复杂的数据类型取一个我们自己更容易理解的别名。总之,可以使用typedef关键字定义一个我们自己的类型名称。   那么,究竟如何定义,又有哪些情况下可已使用呢?接下来我们就对它的几种用法进行说明: (1)基本数据类型定义   有些时候,我们会使用typedef关键字对一些基本数据类型进行重新定义。例如我们使用标准整数的数据类型uint8_t和uint16_t等时,其实他们的定义如下:   typedef unsigned char uint8_t; //无符号8位数   typedef signed char int8_t; //有符号8位数   typedef unsigned int uint16_t; //无符号16位数   typedef signed int int16_t; //有符号16位数   typedef unsigned long uint32_t; //无符号32位数   typedef signed long int32_t; //有符号32位数   很显然就是使用了typedef关键字给既有数据类型分配了一个别名。当我们使用uint8_t时,就和使用unsigned char是一样的。如我们声明uint8_t var时

2021-04-12 15:37:50    分类:博客    

在 C++ 共享库的头文件中声明 'extern "C"' 有什么影响?(What is the Effect of Declaring 'extern "C"' in the Header to a C++ Shared Library?)
问题 基于这个问题,我理解了将 C 库与 C++ 代码链接起来的构造的目的。 现在假设如下: 我有一个用 C++ 编译器编译的“.so”共享库。 标头有一个“typedef stuct”和一些函数声明。 如果标头包含 extern "C" 声明... #ifdef __cplusplus extern "C" { #endif // typedef struct ...; // function decls #ifdef __cplusplus } #endif ……效果如何? 具体来说,我想知道该声明是否有任何不利的副作用,因为共享库被编译为 C++,而不是 C。 在这种情况下,是否有任何理由使用 extern "C" 声明? 回答1 这很重要,这样编译器就不会命名 mangle。 C++ 使用名称修饰来区分具有运算符重载的函数。 对二进制文件运行“/usr/bin/nm”以查看 C++ 对你的函数名做了什么:_ZSt8_DestroyIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiEvT_S7_SaIT0_E extern "C" 可防止名称混淆。 IIRC,这使得程序可以在运行时动态链接符号。 这对于“插件”类型的架构很常见。 回答2 编译 C++ 时,方法名称会发生​​变化(修改) - 您将无法从另一个使用 C 的

2021-12-21 05:04:47    分类:技术分享    c++   c   linux   shared-libraries   extern

Any risk to moving const_cast elements out of a std::initializer_list?
This question builds on this @FredOverflow's question. CLARIFICATION: initializer_list approach is required as the VC++2012 has a bug the prevents forwarded expansion of namespaced arguments. _MSC_VER <= 1700 has the bug. I've written a variadic template function that collapses any number of arguments in a typed container. I use the type's constructor to convert the variadic arguments into consumable values. E.g. _variant_t :) I need this for my MySql C++ library when pushing arguments to prepared statements in one strike, while my MySqlVariant converts the input data to MYSQL_BINDs. As I may

2021-06-01 19:42:14    分类:问答    c++   c++11

虚拟函数和vtable如何实现?(How are virtual functions and vtable implemented?)
问题 我们都知道C ++中有什么虚函数,但是如何在深层次上实现它们呢? 是否可以在运行时修改vtable甚至直接访问vtable? 该vtable是否适用于所有类,或者仅适用于至少具有一个虚函数的类? 对于至少一个条目的函数指针,抽象类是否仅具有NULL? 拥有一个虚拟函数会减慢整个课堂的学习速度吗? 还是仅调用虚拟函数? 速度是否会受到影响(如果虚拟函数是否实际被覆盖),或者只要它是虚拟的,对速度没有影响。 回答1 虚拟功能如何在深层次上实现? 从“ C ++中的虚拟函数”中: 只要程序声明了虚函数,就会为该类构造av-table。 v表由包含一个或多个虚拟功能的类的虚拟功能的地址组成。 包含虚拟函数的类的对象包含一个虚拟指针,该指针指向内存中虚拟表的基地址。 每当有虚拟函数调用时,v表都会用于解析到函数地址。 包含一个或多个虚拟函数的类的对象在内存中对象的最开始处包含一个称为vptr的虚拟指针。 因此,在这种情况下,对象的大小增加了指针的大小。 此vptr包含内存中虚拟表的基地址。 请注意,虚拟表是特定于类的,即,一个类只有一个虚拟表,而与它包含的虚拟函数的数量无关。 该虚拟表又包含该类的一个或多个虚拟函数的基地址。 在对象上调用虚拟函数时,该对象的vptr为内存中的该类提供虚拟表的基地址。 该表用于解析函数调用,因为它包含该类的所有虚拟函数的地址。

2021-04-07 05:29:43    分类:技术分享    c++   polymorphism   virtual-functions   vtable

编写自己的STL容器(Writing your own STL Container)
问题 是否存在有关如何编写与任何STL容器一样行为的新容器的指南? 回答1 这里有一个顺序伪容器我从§23.2.1 \ 4注拼凑起来的iterator_category应该是一个std::input_iterator_tag , std::output_iterator_tag , std::forward_iterator_tag , std::bidirectional_iterator_tag , std::random_access_iterator_tag 。 另请注意,以下内容在技术上比要求的要严格,但这就是想法。 请注意,由于“迭代器”的强大功能,绝大多数“标准”函数在技术上都是可选的。 template <class T, class A = std::allocator<T> > class X { public: typedef A allocator_type; typedef typename A::value_type value_type; typedef typename A::reference reference; typedef typename A::const_reference const_reference; typedef typename A::difference_type difference_type; typedef

2021-04-04 07:52:55    分类:技术分享    c++   stl   c++-standard-library

Rust 是否具有与 F# typedef 等效的惯用语?(Does Rust have an idiomatic equivalent to F# typedefs?)
问题 我正在用 Rust 1.6 重写我的现有代码,我发现在源语言中通过 typedef 标记类型非常方便。 例如,在我的纸牌游戏中,我在 F# 中有一个排名值,定义为: type Rank = uint8 回答1 从标题为使用类型别名创建类型同义词的 Rust 编程语言部分: Rust 提供了声明类型别名以给现有类型另一个名称的能力。 为此,我们使用type关键字。 例如,我们可以像这样为i32创建别名Kilometers : type Kilometers = i32; 现在,别名Kilometers是i32的同义词; [...], Kilometers不是一个单独的新类型。 具有Kilometers类型的值将被视为与i32类型的值相同: type Kilometers = i32; let x: i32 = 5; let y: Kilometers = 5; println!("x + y = {}", x + y); 您应该阅读更多内容,但这可以回答问题。 作为一点社论,我不认为类型别名非常适合人们使用它们的很多地方。 假设您的Rank类型表示与一副牌有关,我建议使用 enum 或 newtype。 原因是使用类型别名您可以执行以下操作: let rank: Rank = 100; 这对于一副典型的纸牌来说是荒谬的。 枚举是受限制的集合。

2021-06-23 12:22:29    分类:技术分享    types   rust   type-alias

RAII C ++教程[关闭](RAII tutorial for C++ [closed])
问题 关闭。 此问题不符合堆栈溢出准则。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 7年前关闭。 改善这个问题 我想学习如何在c ++中使用RAII。 我想我知道它是什么,但不知道如何在我的程序中实现它。 快速的Google搜索没有显示任何不错的教程。 有人能教我RAII吗? 回答1 没什么(也就是说,我认为您不需要完整的教程)。 RAII可以简单地解释为“每个需要清除的资源都应该分配给对象的构造函数。” 换句话说: 指针应封装在智能指针类中(有关示例,请参见std :: auto_ptr,boost :: shared_ptr和boost :: scoped_ptr)。 需要清理的句柄应该封装在可以在销毁时自动释放/释放句柄的类中。 同步应依赖于作用域退出时释放互斥锁/同步原语(有关示例,请参见boost :: mutex :: scoped_lock用法)。 我认为您真的没有关于RAII的教程(例如,您只能拥有一个有关设计模式的教程)。 RAII更像是一种查看资源的方式。 例如,目前我正在使用WinAPI进行编码,并编写了以下类: template<typename H, BOOL _stdcall CloseFunction(H)> class checked_handle { public: typedef

2021-05-07 03:27:51    分类:技术分享    c++   raii

Objective-c 中的循环和异步连接(Looping and asynchronous connections in objective-c)
问题 我有一个表名数组,希望遍历它们并获取它们的名称并附加一个 URL 以创建与 Web 服务的连接以下载 JSON 数据。 循环似乎首先起作用,数组中的三个表名中的每一个都被用于创建与 Web 服务的连接并下载数据,但是当循环完成时(从 3 到 0)循环出现再次启动并无限循环数组中的最后两个表。 日志输出(注意扬声器和参展商一遍又一遍地重复): 2013-12-16 10:38:08.755 WebServiceTest[501:60b] loopCount = 3 2013-12-16 10:38:08.758 WebServiceTest[501:60b] table name = workshop 2013-12-16 10:38:08.817 WebServiceTest[501:60b] LoopCount is: 2 2013-12-16 10:38:08.821 WebServiceTest[501:60b] loopCount = 2 2013-12-16 10:38:08.822 WebServiceTest[501:60b] table name = exhibitor 2013-12-16 10:38:08.827 WebServiceTest[501:60b] LoopCount is: 1 2013-12-16 10:38:08.830

2021-06-11 07:39:28    分类:技术分享    ios   objective-c   cocoa-touch   loops   asynchronous

typedef 基本数据类型什么时候有意义?(When does it make sense to typedef basic data types?)
问题 一家公司的内部 c++ 编码标准文档指出,即使对于 int、char 等基本数据类型,也应该定义自己的 typedef,如“typedef int Int”。 代码的可移植性优势证明了这一点。 但是,是否有关于何时(对于哪些类型的项目)真正有意义的一般考虑/建议? 提前致谢.. 回答1 将int为Int几乎没有任何优势(它没有提供语义上的好处,并导致荒谬,例如在其他平台上保持兼容的typedef long Int )。 但是,将int为例如int32_t (以及long到int64_t等)确实提供了一个优势,因为您现在可以以自记录方式自由选择具有相关宽度的数据类型,并且它将是可移植的(只需在不同的平台上切换 typedef)。 事实上,大多数编译器都提供了一个stdint.h ,其中已经包含了所有这些定义。 回答2 那要看。 你引用的例子: typedef int Int; 只是普通的愚蠢。 这有点像定义一个常量: const int five = 5; 正如变量five变成不同数字的可能性为零一样, typedef Int只能引用原始类型int 。 OTOH,像这样的 typedef: typedef unsigned char byte; 让手指上的生活更轻松(尽管它没有便携性优势),并且像这样: typedef unsigned long long uint64

2021-12-23 02:49:31    分类:技术分享    c++   coding-style

typedef'ing 的标准(Standard for typedef'ing)
问题 海湾合作委员会 4.4.4 c89 我只是想知道在创建类型时是否应该遵循任何标准。 例如: typedef struct date { } date_t; 我也看到有人把大写写成这样: typedef struct date { } Date; 或者对于变量 typedef unsigned int Age; 或这个 typedef unsigned int age_t; 有没有应该遵循的标准。 我个人更喜欢使用 _t 进行后期修复。 非常感谢您的任何建议, 回答1 这很大程度上取决于个人偏好,关键是要保持一致(或者如果您有公司约定,请使用它)。 以下文章有一些命名指南: http://www.montefiore.ulg.ac.be/~piater/Cours/Coding-Style/ 请注意,它会切换 '_t' 部分: typedef struct node_t { void *content; struct node_t *next; } Node; typedef enum season_t { SPRING, SUMMER, FALL, WINTER } Season; 这里有一个关于 C 命名约定的早期讨论: C中最常见的命名约定是什么? 回答2 如果你在一个遵循 POSIX 标准的平台上工作,你应该知道任何以_t结尾的标识符都是为 POSIX 定义的类型保留的

2021-06-23 16:12:43    分类:技术分享    c   typedef

重复的 typedef - 在 C 中无效但在 C++ 中有效?(Repeated typedefs - invalid in C but valid in C++?)
问题 我想要一个标准参考,为什么以下代码在 C 中触发合规性警告(用gcc -pedantic测试;“typedef gcc -pedantic ”),但在 C++ 中很好( g++ -pedantic ): typedef struct Foo Foo; typedef struct Foo Foo; int main() { return 0; } 为什么我不能在 C 中重复定义typedef ? (这对 C 项目的头文件结构具有实际意义。) 回答1 为什么这在 C++ 中编译? 因为 C++ 标准明确说明了这一点。 参考: C++03 标准 7.1.3 typedef 说明符 §7.1.3.2: 在给定的非类作用域中,typedef 说明符可用于重新定义在该作用域中声明的任何类型的名称,以引用它已经引用的类型。 [例子: typedef struct s { /* ... */ } s; typedef int I; typedef int I; 类型定义二; —结束示例] 为什么这无法在 C 中编译? typedef名称没有链接,C99 标准不允许没有链接规范的标识符在相同的范围和相同的名称空间中具有多个声明。 参考: C99 标准:§6.2.2 标识符的链接 §6.2.2/6规定: 以下标识符没有链接: 声明为对象或函数以外的任何标识符的标识符; 声明为函数参数的标识符;

2021-12-08 08:16:49    分类:技术分享    c++   c   typedef   language-lawyer

C ++静态多态性(CRTP)并使用派生类中的typedef(C++ static polymorphism (CRTP) and using typedefs from derived classes)
问题 我阅读了Wikipedia上有关C ++中反复出现的模板模式以实现静态(阅读:编译时)多态性的文章。 我想对其进行概括,以便可以根据派生类型更改函数的返回类型。 (这似乎应该是可行的,因为基本类型从template参数知道派生类型)。 不幸的是,以下代码无法使用MSVC 2010进行编译(我现在无法轻松访问gcc,因此我还没有尝试过)。 有人知道为什么吗? template <typename derived_t> class base { public: typedef typename derived_t::value_type value_type; value_type foo() { return static_cast<derived_t*>(this)->foo(); } }; template <typename T> class derived : public base<derived<T> > { public: typedef T value_type; value_type foo() { return T(); //return some T object (assumes T is default constructable) } }; int main() { derived<int> a; } 顺便说一句,我有一个使用额外模板参数的解决方法

2021-04-03 21:37:52    分类:技术分享    c++   templates   inheritance   typedef   crtp

C语言typedef的用法
转自:http://blog.csdn.net/sergeycao/article/details/3793756 一.基本概念剖析 int* (*a[5])(int, char*); //#1 void (*b[10]) (void (*)()); //#2 double(*)() (*pa)[9]; //#3 1.C语言中函数声明和数组声明。函数声明一般是这样: int fun(int, double); 对应函数指针(pointer to function)的声明是这样: int (*pf)(int, double); 可以这样使用: pf = &fun; //赋值(assignment)操作 (*pf)(5, 8.9);//函数调用操作 也请注意,C语言本身提供了一种简写方式如下: pf = fun; // 赋值(assignment)操作 pf(5, 8.9); // 函数调用操作 不过我本人不是很喜欢这种简写,它对初学者带来了比较多的迷惑。 数组声明一般是这样: int a[5]; 对于数组指针(pointer to array)的声明是这样: int (*pa)[5]; 可以这样使用: pa = &a; // 赋值(assignment)操作 int i = (*pa)[2]; // 将a[2]赋值给i; 2.有了上面的基础,我们就可以对付开头的三只纸老虎了!:)

2021-11-01 20:04:26    分类:博客