前言:
现时同学们对“win81c语言编译器”大约比较关注,你们都需要学习一些“win81c语言编译器”的相关资讯。那么小编在网摘上搜集了一些有关“win81c语言编译器””的相关知识,希望同学们能喜欢,我们一起来学习一下吧!源码模板说明防止头文件重复包含Windows下导出dll说明调用约定typedef struct字节对齐
源码模板
#ifndef XXX_H
#define XXX_H
#ifdef _WIN32
#if defined(XXX_STATIC)
#define DLL_API
#else
#if defined(DLL_EXPORTS)
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif // DLL_EXPORTS
#endif // XXX_STATIC
#define CALLCONV __stdcall
#else
#if __GNUC__ >= 4
#define DLL_API __attribute__((visibility("default")))
#else
#define DLL_API
#endif
#define CALLCONV
#endif // _WIN32
//--------------------data-struct------------------------------
#ifdef __cplusplus
#define ENUM(x) \
enum x
#define STRUCT(x) \
struct x
#else
#define ENUM(x) \
typedef enum x x; \
enum x
#define STRUCT(x) \
typedef struct x x; \
struct x
#endif
#ifdef __GNUC__
#define GNUC_ALIGN(n) __attribute__((align(n)))
#endif
ENUM(x){
};
#ifdef _WIN32
#pragma pack(push)
#pragma pack(n)
#endif
STRUCT(x){
} GNUC_ALIGN(n);
#ifdef _WIN32
#pragma pack(pop)
#endif
//===============================================================
//---------------------function----------------------------------
#ifdef __cplusplus
extern "C" {
#endif
DLL_API void CALLCONV func1();
#ifdef __cplusplus
}
#endif
//===============================================================
#endif // XXX_H
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
说明
防止头文件重复包含
msvc下可以使用#pragma once这样的方式,但为了跨编译器,最好习惯如下通用形式
#ifndef XXX_H
#define XXX_H
#endif
123
Windows下导出dll说明
#if defined(DLL_EXPORTS)
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif // DLL_EXPORTS
12345
Windows下如果需要使用静态库,需要添加#define XXX_STATIC
调用约定
#define CALLCONV __stdcall
12
Windows API接口一般使用__stdcall调用约定(default is __cdecl)
__stdcall和__cdecl参数都是从右到左入栈,不同的是__stdcall由函数自身管理栈,__cdecl由调用者管理栈。
此为msvc x86下__stdcall生成的dll符号名会形如_func@4,需要加.def文件强制命名。
def文件格式如下
LIBRARY "xxx"
EXPORTS
SdkInit @1
SdkCleanup @2
123456
msvc可以使用dumpbin命令查看dll的导出符号,使用lib命令生成xxx.lib动态链接库导入文件
dumpbin /exports xxx.dll
lib /def:xxx.def /mechine:ARM|ARM64|EBC|X64|X86 /out:xxx.lib
123
更详细的命令说明请直接在cmd下查看命令帮助
typedef struct
#define ENUM(x)
#define STRUCT(x)
123
宏定义ENUM和STRUCT的目的是给x加上typedef定义类型,使得C能够和C++一样能够直接使用x,而不是struct x这样繁琐的方式。
字节对齐
msvc和gnuc字节对齐的语法不同,msvc使用#pragma pack(n),gnuc使用__attribute__((align(n)))
#ifdef __GNUC__
#define GNUC_ALIGN(n) __attribute__((align(n)))
#endif
#ifdef _WIN32
#pragma pack(push)
#pragma pack(n)
#endif
STRUCT(x){
} GNUC_ALIGN(n);
#ifdef _WIN32
#pragma pack(pop)
#endif
标签: #win81c语言编译器