1. 程式人生 > >c介面跨平臺標頭檔案模板

c介面跨平臺標頭檔案模板

原始碼模板

#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 CALLSPEC __stdcall #else #if __GNUC__ >= 4 #define DLL_API __attribute__((visibility("default"))) #else #define DLL_API #endif #define CALLSPEC #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 CALLSPEC foobar(); #ifdef __cplusplus } #endif //=============================================================== #endif // XXX_H

說明

防止標頭檔案重複包含

msvc下可以使用#pragma once這樣的方式,但為了跨編譯器,最好習慣如下通用形式

#ifndef XXX_H
#define XXX_H
#endif

Windows下匯出dll說明

#if defined(DLL_EXPORTS)
    #define DLL_API __declspec(dllexport)
#else
    #define DLL_API __declspec(dllimport)
#endif // DLL_EXPORTS

Windows下如果需要使用靜態庫,需要新增#define XXX_STATIC

呼叫約定

#define CALLSPEC __stdcall

Windows API介面一般使用__stdcall呼叫約定(default is __cdecl)
__stdcall__cdecl引數都是從右到左入棧,不同的是__stdcall由函式自身管理棧,__cdecl由呼叫者管理棧。
此為msvc x86__stdcall生成的dll符號名會形如[email protected],需要加.def檔案強制命名。

def檔案格式如下

LIBRARY "xxx"

EXPORTS

SdkInit         @1
SdkCleanup      @2

msvc可以使用dumpbin命令檢視dll的匯出符號,使用lib命令生成xxx.lib動態連結庫匯入檔案

dumpbin /exports xxx.dll
lib   /def:xxx.def  /mechine:ARM|ARM64|EBC|X64|X86 /out:xxx.lib

更詳細的命令說明請直接在cmd下檢視命令幫助

typedef struct

#define ENUM(x)
#define STRUCT(x)

巨集定義ENUMSTRUCT的目的是給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

相關推薦

c介面跨平臺檔案模板

原始碼模板 #ifndef XXX_H #define XXX_H #ifdef _WIN32 #if defined(XXX_STATIC) #define DLL_API #else #if

C++ assert.h檔案

NVIDIA面試筆試題之一: assert.h是c標準庫的一個頭檔案,該標頭檔案的主要目的就是提供一個assert的巨集定義。 assert只是對所給的表示式求值,就像if判斷語句中一樣,然後如果該值為真則正常執行,否則報錯,並呼叫abort(),產生異常中斷,exit出來。 該巨集可以

Linux中C/C++編譯新增檔案和庫路徑方式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

c語言的檔案、巨集、指標

#include命令 #include是檔案包含命令,主要用來引入對應的標頭檔案。#include的處理過程很簡單,就是將標頭檔案的內容插入到該命令所在的位置,從而把標頭檔案和當前原始檔連線成一個原始檔,這與複製貼上的效果相同。#include有兩種使用方式: #include <stdio.h&g

ICTCLAS2016 linux C++版本 使用教程 Eclipse下開發C/C++程式之檔案,庫檔案引用

歡迎使用NLPIR/ICTCLAS2014分詞系統 NLPIR分詞系統前身為2000年釋出的ICTCLAS詞法分析系統,從2009年開始,為了和以前工作進行大的區隔,並推廣NLPIR自然語言處理與資訊檢索共享平臺,調整命名為NLPIR分詞系統。張華平博士先後傾力打造十餘

GooGle c++編碼風格--檔案

本文所學習的GooGle規範下載於: 前言:雖然Google的風格很規範,可是一萬個人有一萬個哈姆雷特,所以結合規範風格,引申出適合自己的風格才是最好的。 1.標頭檔案 1.1#define保護  用於防止某個.h檔案被多重包含,命名格式<PROJ

C語言字串檔案string.h中的strlen,strcat,strcpy,strncpy,strcmp,strlwr,strupr函式

前言 本博文內容基於VC6.0++, 2.本博文主要介紹包含在string.h中的幾個字串相關的函式; strlen(字串陣列名) 字串有效長度函式; 返回值:整型 功能:用來測量一個字串的有效長度(所謂有效,就是從字串中的第一個字元開始,一

C語言stdio檔案包含內容介紹(常用函式用法簡介)

結構體: FILE    在stdio.h標頭檔案中定義的結構。一般來說,它用於對檔案進行操作的函式的引數或者返回值等等。它在標頭檔案中的定義如下(成員後面的註釋援引自百度知道,準確與否我查詢資料未果,到後來專門找個時間將FILE結構體解讀一下):typedef struc

[undefine reference to...]c++ 已經引用檔案的情況編譯顯示未定義

1.仔細檢查程式碼是否寫錯. 2.反覆檢查第一步,再確認c++是否未註明名稱空間. 3.感覺很坑的一點,就是makefile沒有新增對應的.cpp檔案。有時候一不小心就遺忘了. 4.不要告訴我,你編譯之前沒有儲存檔案(非IDE開發環境). 5.比最坑還坑的一點,確認make

如何自定義C語言.h檔案

    在專案實踐中,如果一個.c檔案程式過長,可以把檔案中的函式單獨放在一個頭檔案中,然後在.c中包含該標頭檔案即可。這兩天,根據所看的書《C語言的科學與藝術》和網上的資料,發現實際上有兩種寫法。寫法1:在.h標頭檔案中就包含函式的實現,這種標頭檔案實際上是把函式放在一起,

C++ 中#include檔案兩種方式的區別

<>:先在系統目錄中尋找標頭檔案,然後再到當前目錄下找,一般用於標準的標頭檔案 stdio.h和 stdlib.h等等"  ":先在當前目錄中尋找標頭檔案,然後再到系統目錄中找,一般用於in

C++_萬能檔案

#include <bits/stdc++.h> // C++ includes used for precompiling -*- C++ -*- // Copyright (C) 2003-2014 Free Software Foundation, Inc. // // Th

C/C++語言在檔案中定義全域性變數

轉載:http://blog.csdn.net/chenqiai0/article/details/8490665 全域性變數可不可以定義在可被多個.C檔案包含的標頭檔案中?為什麼? 可以,在不同的C檔案中以static形式來宣告同名全域性變數。標頭檔案中不可以直接定

Linux C程式設計——常用檔案

1 資料型別 1.1 stdint.h uint8_t uint16_t uint32_t 1.2 stdbool.h     C語言中是沒有bool型別的(C++中有),若要使用此型別,需要包含標

使用#include包含C++的所有檔案

參考部落格:http://blog.csdn.net/u011466175/article/details/24638621?utm_source=tuicool&utm_medium=referral #include<bits/stdc++.h>這個

VS2015建立一個完整的c++工程:檔案.h 原始檔.cpp,自動生成類

開啟VS2015 ,新建VS win32工程,前面步驟很簡單,不再闡述 下面直接開始: 新建一個VC++ win32的程式, 在原始檔加下新增.cpp檔案,一般放main函式 #include <iostream> #include <locale&

c語言List檔案和應用

util_list.h#ifndef __UTIL_LIST__ #define __UTIL_LIST__ /*雙鏈節點*/ typedef struct list_node { list_node * prev; list_node * next; } LIST

#include包含C++的所有檔案

做CF看見別人用這個函式,然後就能直接用vector,set,string那些函數了,摸不著頭腦,感覺特神奇就百度了一下,才發現這個是C++版本升級,然後檔案自帶的,方便了程式設計師吧。不然每次都得敲那模板老長…… 使用和平常的標頭檔案一樣,如下: #include<

C++中關於檔案的問題

標頭檔案包含問題 根據編譯原理,在編譯的過程中,只是把標頭檔案中的內容進行替換,若重複包含,就會使同一段程式碼在該檔案中出現兩次或多次,引起編譯錯誤。 介紹兩種常用的方法, 其一是#ifndef: //A為標頭檔案名,H代表這是一個頭檔案的巨集名 #ifndef

關於c++裡面引用檔案尖括號和雙引號的使用

今天寫資料庫,因為用的是mysql自帶的c api。設計到庫的匯入和標頭檔案的匯入。 用include 引用標頭檔案時,雙引號和尖括號的區別: 1.雙引號:引用非標準庫的標頭檔案,編譯器首先在程式原始檔所在目錄查詢,如果未找到,則去系統預設目錄查詢,通常用於引用使