t******c 发帖数: 1103 | 1 有一个struct A, 包含很多很多成员. 在某个版本中加入了一个新成员变量, int a.
在未知版本的情况下, 有无方法检测A.a是否存在? 如果有请说明其优劣. 限定C语言(
no C++).
求高人解答~ |
a*w 发帖数: 4495 | 2 sizeof?
【在 t******c 的大作中提到】 : 有一个struct A, 包含很多很多成员. 在某个版本中加入了一个新成员变量, int a. : 在未知版本的情况下, 有无方法检测A.a是否存在? 如果有请说明其优劣. 限定C语言( : no C++). : 求高人解答~
|
a**e 发帖数: 64 | 3 很难理解。没有源码如何“加入新成员变量, int a” |
t******c 发帖数: 1103 | 4 我觉得题目既然说 "有很多很多成员", 意思是a可能不是唯一增加的成员变量吧.
而且sizeof会随平台/版本有不同结果, 不太靠谱.
【在 a*w 的大作中提到】 : sizeof?
|
d*********8 发帖数: 2192 | 5 FYI
#ifndef CONTAINING_RECORD
#define CONTAINING_RECORD(address, type, field) \
((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field)))
#endif |
t******c 发帖数: 1103 | 6 小弟才疏学浅, 真没看懂. 大神能解释一下吗?
尤其是这里的address是指的什么?
【在 d*********8 的大作中提到】 : FYI : #ifndef CONTAINING_RECORD : #define CONTAINING_RECORD(address, type, field) \ : ((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field))) : #endif
|
i*****o 发帖数: 1714 | 7 假定last是这个struct的最后一个member:(void*)A->last - (void*)A + sizeof(A->
last) == sizeof(A) 就说明里面有a,否则没有。
★ 发自iPhone App: ChineseWeb 7.7
【在 t******c 的大作中提到】 : 有一个struct A, 包含很多很多成员. 在某个版本中加入了一个新成员变量, int a. : 在未知版本的情况下, 有无方法检测A.a是否存在? 如果有请说明其优劣. 限定C语言( : no C++). : 求高人解答~
|
a****l 发帖数: 8211 | 8 http://www.cpptalk.net/containingrecord-macro-vt50598.html
Hi All
I was reading an article
"http://msdn.microsoft.com/msdnmag/issues/1000/Winsock/default.aspx"
where I encountered a macro called CONTAINING_RECORD. A purpose of this
macro is to return a poniter to the extended structure.
After the pointer to the OVERLAPPED structure is returned, the
CONTAINING_RECORD macro can be used to obtain a pointer to the extended
structure.
OVERLAPPED *Overlap;
OVERLAPPEDPLUS *OverlapPlus;
typedef struct _OVERLAPPEDPLUS {
SOCKET s, sclient;
OVERLAPPED ol;
int OpCode;
WSABUF wbuf;
DWORD dwBytes, dwFlags;
// other useful information
} OVERLAPPEDPLUS;
OverlapPlus = CONTAINING_RECORD(Overlap, OVERLAPPEDPLUS, ol);
The defination of macro is as follows :
#define CONTAINING_RECORD(address, type, field)
((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field)))
Could anyone help me out to understand the operations being performed
in macro.
Regards
Dinesh
【在 d*********8 的大作中提到】 : FYI : #ifndef CONTAINING_RECORD : #define CONTAINING_RECORD(address, type, field) \ : ((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field))) : #endif
|
x****o 发帖数: 21566 | 9 this is Linux how access the field in the structure...?
【在 d*********8 的大作中提到】 : FYI : #ifndef CONTAINING_RECORD : #define CONTAINING_RECORD(address, type, field) \ : ((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field))) : #endif
|
d*********8 发帖数: 2192 | 10 This is a C macro. has nothing to do with OS
【在 x****o 的大作中提到】 : this is Linux how access the field in the structure...?
|
|
|
d*********8 发帖数: 2192 | 11 哦,对了。里面是有几个微软变态的TYPEDEF
其实就是char* void*而已。
【在 d*********8 的大作中提到】 : This is a C macro. has nothing to do with OS
|
t******c 发帖数: 1103 | 12 有一个struct A, 包含很多很多成员. 在某个版本中加入了一个新成员变量, int a.
在未知版本的情况下, 有无方法检测A.a是否存在? 如果有请说明其优劣. 限定C语言(
no C++).
求高人解答~ |
a*w 发帖数: 4495 | 13 sizeof?
【在 t******c 的大作中提到】 : 有一个struct A, 包含很多很多成员. 在某个版本中加入了一个新成员变量, int a. : 在未知版本的情况下, 有无方法检测A.a是否存在? 如果有请说明其优劣. 限定C语言( : no C++). : 求高人解答~
|
a**e 发帖数: 64 | 14 很难理解。没有源码如何“加入新成员变量, int a” |
t******c 发帖数: 1103 | 15 我觉得题目既然说 "有很多很多成员", 意思是a可能不是唯一增加的成员变量吧.
而且sizeof会随平台/版本有不同结果, 不太靠谱.
【在 a*w 的大作中提到】 : sizeof?
|
d*********8 发帖数: 2192 | 16 FYI
#ifndef CONTAINING_RECORD
#define CONTAINING_RECORD(address, type, field) \
((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field)))
#endif |
t******c 发帖数: 1103 | 17 小弟才疏学浅, 真没看懂. 大神能解释一下吗?
尤其是这里的address是指的什么?
【在 d*********8 的大作中提到】 : FYI : #ifndef CONTAINING_RECORD : #define CONTAINING_RECORD(address, type, field) \ : ((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field))) : #endif
|
i*****o 发帖数: 1714 | 18 假定last是这个struct的最后一个member:(void*)A->last - (void*)A + sizeof(A->
last) == sizeof(A) 就说明里面有a,否则没有。
★ 发自iPhone App: ChineseWeb 7.7
【在 t******c 的大作中提到】 : 有一个struct A, 包含很多很多成员. 在某个版本中加入了一个新成员变量, int a. : 在未知版本的情况下, 有无方法检测A.a是否存在? 如果有请说明其优劣. 限定C语言( : no C++). : 求高人解答~
|
a****l 发帖数: 8211 | 19 http://www.cpptalk.net/containingrecord-macro-vt50598.html
Hi All
I was reading an article
"http://msdn.microsoft.com/msdnmag/issues/1000/Winsock/default.aspx"
where I encountered a macro called CONTAINING_RECORD. A purpose of this
macro is to return a poniter to the extended structure.
After the pointer to the OVERLAPPED structure is returned, the
CONTAINING_RECORD macro can be used to obtain a pointer to the extended
structure.
OVERLAPPED *Overlap;
OVERLAPPEDPLUS *OverlapPlus;
typedef struct _OVERLAPPEDPLUS {
SOCKET s, sclient;
OVERLAPPED ol;
int OpCode;
WSABUF wbuf;
DWORD dwBytes, dwFlags;
// other useful information
} OVERLAPPEDPLUS;
OverlapPlus = CONTAINING_RECORD(Overlap, OVERLAPPEDPLUS, ol);
The defination of macro is as follows :
#define CONTAINING_RECORD(address, type, field)
((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field)))
Could anyone help me out to understand the operations being performed
in macro.
Regards
Dinesh
【在 d*********8 的大作中提到】 : FYI : #ifndef CONTAINING_RECORD : #define CONTAINING_RECORD(address, type, field) \ : ((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field))) : #endif
|
x****o 发帖数: 21566 | 20 this is Linux how access the field in the structure...?
【在 d*********8 的大作中提到】 : FYI : #ifndef CONTAINING_RECORD : #define CONTAINING_RECORD(address, type, field) \ : ((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field))) : #endif
|
|
|
d*********8 发帖数: 2192 | 21 This is a C macro. has nothing to do with OS
【在 x****o 的大作中提到】 : this is Linux how access the field in the structure...?
|
d*********8 发帖数: 2192 | 22 哦,对了。里面是有几个微软变态的TYPEDEF
其实就是char* void*而已。
【在 d*********8 的大作中提到】 : This is a C macro. has nothing to do with OS
|
b*******s 发帖数: 5216 | 23 规定初始化时其余成员一律为0,而这个必须为1
这样按byte加起来不为0就存在这个变量
【在 t******c 的大作中提到】 : 有一个struct A, 包含很多很多成员. 在某个版本中加入了一个新成员变量, int a. : 在未知版本的情况下, 有无方法检测A.a是否存在? 如果有请说明其优劣. 限定C语言( : no C++). : 求高人解答~
|
t*****r 发帖数: 142 | 24 不明白想干什么。随便写个code,用上A.a,一编译不就知道了?
Runtime 检测应该是很变态的要求,c 毕竟是编译语言。
【在 t******c 的大作中提到】 : 有一个struct A, 包含很多很多成员. 在某个版本中加入了一个新成员变量, int a. : 在未知版本的情况下, 有无方法检测A.a是否存在? 如果有请说明其优劣. 限定C语言( : no C++). : 求高人解答~
|
t*****r 发帖数: 142 | 25 不明白想干什么。随便写个code,用上A.a,一编译不就知道了?
Runtime 检测应该是很变态的要求,c 毕竟是编译语言。
【在 t******c 的大作中提到】 : 有一个struct A, 包含很多很多成员. 在某个版本中加入了一个新成员变量, int a. : 在未知版本的情况下, 有无方法检测A.a是否存在? 如果有请说明其优劣. 限定C语言( : no C++). : 求高人解答~
|
n*****3 发帖数: 1584 | 26 it is used in the production code; sometime it is
hard to test it if it is part of a huge old system;
【在 t*****r 的大作中提到】 : 不明白想干什么。随便写个code,用上A.a,一编译不就知道了? : Runtime 检测应该是很变态的要求,c 毕竟是编译语言。
|
m********5 发帖数: 17667 | 27 不是啊,比如你只改了很大一个project的一小部分
也只编译了这一部分,那么project中的其他部分仍然用了老的定义
或者其他部分对size敏感,hard-coded的,也要吃鳖
所以这东西其实很常见,项目做多了应该看到过。
【在 t*****r 的大作中提到】 : 不明白想干什么。随便写个code,用上A.a,一编译不就知道了? : Runtime 检测应该是很变态的要求,c 毕竟是编译语言。
|
h**********c 发帖数: 4120 | 28 让我们猜一下出题人的意思
可能是这样, 你有一个.h,编译的时候,用到一个.o,运行时候甚至是一个dll.
<<<<<<<<
IDE多半告诉你它从.h看到的是什么,因为version control 或着qa 没做好, .h does
match .o 或者是 dll。
>>>>>>>>>
IDE多半告诉你它从.h看到的是什么,因为version control 或着qa 没做好, .h does
not match .o 或者是 dll。
这种现象在open source lib应该比较普遍。
<<<<<<<<
所以出题的人可能是想让你做一个c 的static type checking .
>>>>>>>>>>>>
所以出题的人可能是想让你做一个c 的dynamic type checking .
这种题就有点偏了,有的公司需要专家系统,有的要数据库....
面面一个人的基本逻辑思维,为人处事,肯不肯做事就行了。
看f35那个活干的,这种问题不奇怪。整个大氛围不是推理做事,而是难偏怪,
chopping logic.
【在 t******c 的大作中提到】 : 有一个struct A, 包含很多很多成员. 在某个版本中加入了一个新成员变量, int a. : 在未知版本的情况下, 有无方法检测A.a是否存在? 如果有请说明其优劣. 限定C语言( : no C++). : 求高人解答~
|
h**********c 发帖数: 4120 | 29 五年以上system software
答不上来是不应该的
看背景看面什么了 |
p***o 发帖数: 1252 | 30 这需求不是挺常见么, 也跟open source扯不上什么关系, 另外对齐方式估计也得检查。
Win32里面的解决方式就是检查struct的大小,比如说
typedef struct _SECURITY_ATTRIBUTES {
DWORD nLength;
LPVOID lpSecurityDescriptor;
BOOL bInheritHandle;
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
Members
nLength
The size, in bytes, of this structure. Set this value to the size of the SEC
URITY_ATTRIBUTES structure.
does
does
【在 h**********c 的大作中提到】 : 让我们猜一下出题人的意思 : 可能是这样, 你有一个.h,编译的时候,用到一个.o,运行时候甚至是一个dll. : <<<<<<<< : IDE多半告诉你它从.h看到的是什么,因为version control 或着qa 没做好, .h does : match .o 或者是 dll。 : >>>>>>>>> : IDE多半告诉你它从.h看到的是什么,因为version control 或着qa 没做好, .h does : not match .o 或者是 dll。 : 这种现象在open source lib应该比较普遍。 : <<<<<<<<
|
|
|
h**********c 发帖数: 4120 | 31 Win32 or system software is not my area.
I wrote applications. Occasionally compile some open source projects for
experiments/prototypes.
If checking size only, if someone added a char[4] or two short int the size
won't change. Probably the interviewers want to hear something implementing
reflection(java) , moc_class (QT) , or their similarity.
Win32 or system software is not my area.
查。
SEC
【在 p***o 的大作中提到】 : 这需求不是挺常见么, 也跟open source扯不上什么关系, 另外对齐方式估计也得检查。 : Win32里面的解决方式就是检查struct的大小,比如说 : typedef struct _SECURITY_ATTRIBUTES { : DWORD nLength; : LPVOID lpSecurityDescriptor; : BOOL bInheritHandle; : } SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES; : Members : nLength : The size, in bytes, of this structure. Set this value to the size of the SEC
|