天道酬勤,学无止境

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?

标签

评论

You can read all rules relative to typedef specifier for C++2003 ANSI ISO IEC 14882 2003 in section 7.1.3. In 7.1.3, 2) it have been said the identity typedef is allowed if the name already refers to some type.

This is legal:

typedef int Request;
typedef Request Request; // Redefines "Request" with no effect 

And that it is not:

typedef Request Request; // Illegal, first "Request" doesn't name a type. 

The standard has a specific example relating to this. C++2003, §7.1.3/2:

In a given non-class scope, a typedef specifier can be used to redefine the name of any type declared in that scope to refer to the type to which it already refers. [Example:

typedef struct s { /* ... */ } s;
typedef int I;
typedef int I;
typedef I I;

end example]

In 7.1.3, 3) it have been said that use typedef to redefine type to alias to another type is prohibited

If Request is only passed as a parameter it seems to be a opaque pointer.
There should be a

typedef struct Request Request 

somewhere in the code. (see comments on your question)
This is used to define an API and hide implementation details. So you can later change the implementation without changing the API again.

The client does not need to know anything about the acutal type - its just kind of a handle.
Everything you want to do with it has to be done with the api methods (creation, delete, load, init, ...)
Usually the handle Request will be casted to something more meaningfull in the implementation of the api. This was/is usually done in old C.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 静态成员函数中包含类的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 ... } } 有防止这种情况发生的好方法吗? 我可以想象碰到在封闭类中声明为私有的东西,但是那将迫使我编写额外的代码
  • 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
  • 此模板代码不会编译。 有任何想法吗? [关闭](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
  • 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 -------- */
  • 如何在 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
  • 如何在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
  • Objective-C KVO 不适用于 C 联合(Objective-C KVO doesn't work with C unions)
    问题
  • 对结构进行 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
  • 使用 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
  • 警告:由于数据类型范围有限导致崩溃,比较始终为真(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
  • #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 对定义没有影响。
  • 屏幕颜色反转在 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
  • 什么时候使用包含守卫?(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[])
  • 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
  • 指向 C 中的自我结构的指针(Pointer to self struct in C)
    问题
  • 带有动画的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
  • 结构体(基础知识)
    结构声明: 方式: 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
  • 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
  • 什么是图
    目录一、图引入二、什么是图(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亿的互联网人来说,你真的可以全部认识吗?大多数同学此刻一定是定神一想,这还用问?你是傻子吗?这一定不可能呀。但是对于这个问题,我们可以用我们未来学习的图的知识解决,啪啪打脸可真不好受,哈哈哈!除了上述问题,对于下图,我再来提出两个问题:从陈家庄到张家村,怎么走最快呢?怎么修公路使得村村通的花费最少呢?有些同学说了,这还不简单,让我用我的火眼金睛数一数。但是对于下述这张图呢?算了
  • C++教程第三部分
    一.前言本文将使用最快的方法过完C++。由于是快速阅览,本文不会描述过多的详细知识,如何深入还需要各位努力;不过学习过了一遍内容后,再学习C++也会较为容易。更多详细进阶教程可以关注微信公众号 “C和C加加” 回复“ZXC”即可免费获取二.自定义数据类型1.结构体结构体可以包含不同数据类型的结构。定义结构体的一般形式结构体变量名的定义和初始化:结构体变量的使用:具有相同类型的结构体变量可以进行赋值运算,但是不能输入输出对结构体变量的成员引用:结构体变量名.成员名指向结构体的指针变量引用格式:指针变量名->成员名;结构体数组的定义,初始化和使用与结构体变量、基本类型数组相似结构体作为函数传递有三种:值传递,引用传递,指针传递2.结构体大小和字节对齐现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐.为什么需要字节对齐?各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方