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)
巨集定義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
相關推薦
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.雙引號:引用非標準庫的標頭檔案,編譯器首先在程式原始檔所在目錄查詢,如果未找到,則去系統預設目錄查詢,通常用於引用使