首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >编写(函数原型,函数指针,外部指针)更小

编写(函数原型,函数指针,外部指针)更小
EN

Stack Overflow用户
提问于 2016-07-15 23:35:07
回答 3查看 427关注 0票数 1

有没有办法用一些魔法写一个宏或typedef,这样我就可以把下面的三行写得更小?

代码语言:javascript
运行
复制
extern "C" NTSTATUS NTAPI KeInitializeApc( PKAPC Apc, 
                                           PKTHREAD thread,
                                           UCHAR state_index,
                                           PKKERNEL_ROUTINE ker_routine,
                                           PKRUNDOWN_ROUTINE rd_routine,
                                           PKNORMAL_ROUTINE nor_routine,
                                           UCHAR mode,
                                           PVOID context );
typedef NTSTATUS (NTAPI *KeInitializeApc_t)( PKAPC Apc, 
                                             PKTHREAD thread,
                                             UCHAR state_index,
                                             PKKERNEL_ROUTINE ker_routine,
                                             PKRUNDOWN_ROUTINE rd_routine,
                                             PKNORMAL_ROUTINE nor_routine,
                                             UCHAR mode,
                                             PVOID context );
extern "C" KeInitializeApc_t PKeInitializeApc;

另外,我必须在原型、函数和外部使用外部"C“吗?如果我想要没有乱码的名字?

代码语言:javascript
运行
复制
extern "C" NTSTATUS NTAPI KeInitializeApc( PKAPC Apc, 
                                           PKTHREAD thread,
                                           UCHAR state_index,
                                           PKKERNEL_ROUTINE ker_routine,
                                           PKRUNDOWN_ROUTINE rd_routine,
                                           PKNORMAL_ROUTINE nor_routine,
                                           UCHAR mode,
                                           PVOID context );
extern "C" typedef NTSTATUS (NTAPI *KeInitializeApc_t)( PKAPC Apc, 
                                                        PKTHREAD thread,
                                                        UCHAR state_index,
                                                        PKKERNEL_ROUTINE ker_routine,
                                                        PKRUNDOWN_ROUTINE rd_routine,
                                                        PKNORMAL_ROUTINE nor_routine,
                                                        UCHAR mode,
                                                        PVOID context );
extern "C" KeInitializeApc_t PKeInitializeApc;

在每一行上使用外部"C“似乎都不正确。

耽误您时间,实在对不起。

EN

回答 3

Stack Overflow用户

发布于 2016-07-15 23:46:34

如果您能够/允许使用C++11,您可以尝试使用decltype,如下所示:

代码语言:javascript
运行
复制
extern "C" {
    NTSTATUS NTAPI KeInitializeApc( PKAPC Apc, 
                                    PKTHREAD thread,
                                    UCHAR state_index,
                                    PKKERNEL_ROUTINE ker_routine,
                                    PKRUNDOWN_ROUTINE rd_routine,
                                    PKNORMAL_ROUTINE nor_routine,
                                    UCHAR mode,
                                    PVOID context );

    using KeInitializeApc_t = decltype(&KeInitializeApc);
    KeInitializeApc_t PKeInitializeApc;
}

编辑:我错过了这里的c标签。如果您想要编写代码,使其同时适用于C和C++,您可以尝试:

代码语言:javascript
运行
复制
#ifdef __cplusplus
extern "C" {
#endif

typedef NTSTATUS NTAPI KeInitializeApc_f( PKAPC Apc, 
                                          PKTHREAD thread,
                                          UCHAR state_index,
                                          PKKERNEL_ROUTINE ker_routine,
                                          PKRUNDOWN_ROUTINE rd_routine,
                                          PKNORMAL_ROUTINE nor_routine,
                                          UCHAR mode,
                                          PVOID context );
KeInitializeApc_f KeInitializeApc;
typedef KeInitializeApc_f *KeInitializeApc_t;
KeInitializeApc_t PKeInitializeApc;

#ifdef __cplusplus
}
#endif
票数 4
EN

Stack Overflow用户

发布于 2016-07-15 23:41:33

您可以将定义分组到一个extern "C"中,如下所示:

代码语言:javascript
运行
复制
#ifdef __cplusplus
extern "C" {
#endif

NTSTATUS NTAPI KeInitializeApc( PKAPC Apc, 
                                           PKTHREAD thread,
                                           UCHAR state_index,
                                           PKKERNEL_ROUTINE ker_routine,
                                           PKRUNDOWN_ROUTINE rd_routine,
                                           PKNORMAL_ROUTINE nor_routine,
                                           UCHAR mode,
                                           PVOID context );
typedef NTSTATUS (NTAPI *KeInitializeApc_t)( PKAPC Apc, 
                                                        PKTHREAD thread,
                                                        UCHAR state_index,
                                                        PKKERNEL_ROUTINE ker_routine,
                                                        PKRUNDOWN_ROUTINE rd_routine,
                                                        PKNORMAL_ROUTINE nor_routine,
                                                        UCHAR mode,
                                                        PVOID context );
KeInitializeApc_t PKeInitializeApc;

#ifdef __cplusplus
}
#endif
票数 2
EN

Stack Overflow用户

发布于 2016-07-15 23:51:31

有没有一种方法可以用魔法写一个宏或类型定义函数,这样我就可以把下面的三行写得更小?

也许你正在寻找类似这样的东西:

代码语言:javascript
运行
复制
#define NTDECLARE(name, args) \
  extern "C" NTSTATUS NTAPI name args; \
  extern "C" typedef NTSTATUS (NTAPI * name ## _t) args; \
  extern name ## _t P ## name;

NTDECLARE(KeInitializeApc, ( PKAPC Apc, 
                             PKTHREAD thread,
                             UCHAR state_index,
                             PKKERNEL_ROUTINE ker_routine,
                             PKRUNDOWN_ROUTINE rd_routine,
                             PKNORMAL_ROUTINE nor_routine,
                             UCHAR mode,
                             PVOID context ) )

当然,NTDECLARE宏可用于声明具有不同名称和可能的参数的其他函数、类型、指针三元组。

另外,我必须在原型、函数和外部使用外部"C“吗?

您不需要对指针声明应用extern "C",但是如果代码用于头文件,那么您可能需要一个普通的extern,如下所示。您可以考虑在所有单独的声明中省略extern "C",而将它们全部放入一个extern "C" { ... }块中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38400035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档