Cross Platform Note: STD C++ Preprocessor directives & pre-defined macros
ref: http://www.cplusplus.com/doc/tutorial/preprocessor/
concolusion:
directives:
#define #undef
#include
#if #else #elif #endif #ifdef #ifndef
#error ( #warning is NOT A STANDARD DIRECTIVE, since not shown in the page above, but most compilers have it. more: http://stackoverflow.com/questions/171435/portability-of-warning-preprocessor-directive )
#line
#pragma ( all compiler support #pragma to set options, but "These options are specific for the platform and the compiler you use.", so no standard options.)
macros:
__LINE__
__FILE__
__DATE__
__TIME__
(__FUNCTION__ is NOT STANDARD MACRO. __FUNCTION__ is defined on both MSVC & GCC; GCC better use __PRETTY_FUNCTION__. c99 has standard __func__)
__cplusplus (has a value to identifying C++98 / 11 )
__STD_HOSTED__
optional: __STDC__ __STDC_VERSION__ __STDC_MB_MIGHT_NEQ_WC__ __STDC_ISO_10646__ __STDCPP_STRICT_POINTER_SAFETY__ __STDCPP_THREADS__
Example of use non standard macros (compiler specific) in Blade:
/********************************************************************
created: 2009/02/07
filename: Platform.h
author: Crazii purpose: the platform dependent definitions
*********************************************************************/
#ifndef __Blade_Platform_h__
#define __Blade_Platform_h__ /************************************************************************/
/* processor unit */
/************************************************************************/
#define BLADE_PROCESSOR_X86 (0)
#define BLADE_PROCESSOR_IA64 (1)
#define BLADE_PROCESSOR_PPC (2)
#define BLADE_PROCESSOR_ARM (3) #if defined ARM || defined __arm__ || defined _ARM
# define BLADE_PROCESSOR BLADE_PROCESSOR_ARM #elif defined __ia64 || defined _M_IA64 || defined __ia64__
# define BLADE_PROCESSOR BLADE_PROCESSOR_IA64 #elif defined __X86__ || defined __i386__ || defined i386 || defined _M_IX86 || defined __386__ || defined __x86_64__ || defined _M_X64
# define BLADE_PROCESSOR BLADE_PROCESSOR_X86 #elif defined __PPC__ || defined __POWERPC__ || defined powerpc || defined _POWER || defined __ppc__ || defined __powerpc__ || defined _M_PPC
# define BLADE_PROCESSOR BLADE_PROCESSOR_PPC #else
# error "processor not supported yet."
#endif /************************************************************************/
/* this is the system specific,windows and linux, etc */
/************************************************************************/ #define BLADE_PLATFORM_WINDOWS (0)
#define BLADE_PLATFORM_WINPHONE (1) #define BLADE_PLATFORM_LINUX (2)
#define BLADE_PLATFORM_ANDROID (3)
#define BLADE_PLATFORM_IOS (4)
#define BLADE_PLATFORM_MAC (5) #if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) # define BLADE_PLATFORM BLADE_PLATFORM_WINDOWS #elif defined(WP8) && defined(_WP8) # define BLADE_PLATFORM BLADE_PLATFORM_WINPHONE #elif defined(ANDROID) || defined(__ANDROID__)//since android will also define __linux__, we need check android first #define BLADE_PLATFORM BLADE_PLATFORM_ANDROID #elif defined(__linux__) # define BLADE_PLATFORM BLADE_PLATFORM_LINUX #else
# error "current system not support yet."
#endif //Careful on using those class system definition. different system may have different APIs.
//i.e. Unix POSIX version difference, windows Desktop/Mobile API differences. #if defined(__unix__)
# define BLADE_IS_UNIX_CLASS_SYSTEM
#else
# define BLADE_IS_UNIX_CLASS_SYSTEM
#endif #if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) || defined(_WIN32_WCE) || defined(WINRT) || defined(_WINRT) || defined(WP8) || defined(_WP8)
# define BLADE_IS_WINDOWS_CLASS_SYSTEM
#else
# define BLADE_IS_WINDOWS_CLASS_SYSTEM
#endif /************************************************************************/
/* Architecture (32/64 bit) */
/************************************************************************/ #define BLADE_ARCHITECTURE_32BIT (0)
#define BLADE_ARCHITECTURE_64BIT (1) #if defined(__x86_64__) || defined(_M_X64) || defined(_M_IA64) || defined(_M_AMD64) || defined(__powerpc64__) || defined(__alpha__) || defined(__ia64__) || defined(__s390__) || defined(__s390x__)
# define BLADE_ARCHITECTURE BLADE_ARCHITECTURE_64BIT
# define BLADE_MEMORY_ALIGNMENT ()
#else
# define BLADE_ARCHITECTURE BLADE_ARCHITECTURE_32BIT
# define BLADE_MEMORY_ALIGNMENT ()
#endif /************************************************************************/
/* this is the compiler specific ,MSVC and GCC currently supported */
/************************************************************************/
#define BLADE_COMPILER_MSVC (0)
#define BLADE_COMPILER_GNUC (1) #if defined(_MSC_VER)
# define BLADE_COMPILER BLADE_COMPILER_MSVC
# define BLADE_ALIGNED(n) __declspec(align(n))
# define BLADE_CDECL __cdecl
# define BLADE_STDCALL __stdcall
# define BLADE_FASTCALL __fastcall
# define BLADE_FUNCTION __FUNCTION__
# define BLADE_ALLWAYS_INLINE __forceinline
#elif defined(__GNUC__)
# define BLADE_COMPILER BLADE_COMPILER_GNUC
# define BLADE_ALIGNED(n) __attribute__((aligned(n)))
# define BLADE_CDECL __attribute__((cdecl))
# define BLADE_STDCALL __attribute__((stdcall))
# define BLADE_FASTCALL __attribute__((fastcall))
# define BLADE_FUNCTION __PRETTY_FUNCTION__
# define BLADE_ALLWAYS_INLINE __attribute__((always_inline))
#else
# error "Compiler not supported yet."
# define BLADE_ALLWAYS_INLINE inline
#endif #if defined(_DEBUG) || defined(DEBUG)
# define BLADE_DEBUG
#else
# define BLADE_DEBUG
#endif #define BLADE_ENDIAN_LITTLE 0
#define BLADE_ENDIAN_BIG 1 //endian macros
//HOWTO: ARM processor can have dynamic endian with endian map, how to check? #if BLADE_PROCESSOR == BLADE_PROCESSOR_X86 || \
BLADE_PROCESSOR == BLADE_PROCESSOR_ARM #define BLADE_ENDIAN BLADE_ENDIAN_LITTLE #else #define BLADE_ENDIAN BLADE_ENDIAN_BIG #endif //make unicode macro having a value
#if defined(UNICODE) || defined(_UNICODE)
# undef UNICODE
# define UNICODE
# define BLADE_UNICODE
#else
# define BLADE_UNICODE
#endif #endif // __Blade_Platform_h__
Cross Platform Note: STD C++ Preprocessor directives & pre-defined macros的更多相关文章
- “CMake”这个名字是“cross platform make”
cmake_百度百科 https://baike.baidu.com/item/cmake/7138032?fr=aladdin CMake 可以编译源代码.制作程序库.产生适配器(wrapper). ...
- V4 Reduce Transportable Tablespace Downtime using Cross Platform Incremental Backup (Doc ID 2471245.1)
V4 Reduce Transportable Tablespace Downtime using Cross Platform Incremental Backup (Doc ID 2471245. ...
- Comparing Xamarin and Delphi XE5 to Xcode for Cross Platform Mobile App Development
Comparing Xamarin and Delphi XE5 to Xcode for Cross Platform Mobile App Development If you are consi ...
- Gtest:Using visual studio 2017 cross platform feature to compile code remotely
参考:使用Visual Studio 2017作为Linux C++开发工具 前言 最近在学Gtest单元测试框架,由于平时都是使用Source Insight写代码,遇到问题自己还是要到Linux下 ...
- Cross platform GUI for creating SSL certs with OpenSSL
Someone said: from : https://micksmix.wordpress.com/2012/08/09/xca-cross-platform-gui-for-creating-s ...
- Cross platform
值得学习的C/C++语言开源项目 (1)ACE 庞大.复杂,适合大型项目.开源.免费,不依赖第三方库,支持跨平台. http://www.cs.wustl.edu/~schmidt/ACE.html ...
- Qt编程之Qt样例表(QSS)
For a long time, Qt has allowed you to decorate your GUIs with CSS’ish style sheets. Inspired by the ...
- c++11-17 模板核心知识(二)—— 类模板
类模板声明.实现与使用 Class Instantiation 使用类模板的部分成员函数 Concept 友元 方式一 方式二 类模板的全特化 类模板的偏特化 多模板参数的偏特化 默认模板参数 Typ ...
- Visual Studio 2015 Pre Secondary Installer 在哪里
安装vs2015 pre后,会自动打开Secondary Installer, 用于Cross Platform的移动开发框架,包括Cordova插件.若安装失败,启动程序位置: "D:\P ...
随机推荐
- ImportError: No module named _tkinter, please install the python-tk package ubuntu运行tkinter错误
这是由于Python的版本没有包含tkinter的模块,只需要把tk的package安装就可以了. 一般在Linux才出现,windows版本一般已经包含了tkinter模块. apt-get ins ...
- ps文件解析(纯c解析代码)
参考链接:1. PS流的格式和解析总结 http://www.cnblogs.com/lihaiping/p/4181607.html 2. TS科普5 PES包解析 https://blog.cs ...
- 练习 map集合被使用是因为具备映射关系 "进度班" "01" "张三" "进度班" "02" "李四" "J1701" "01" "王五" "J1701" "02" "王二" 此信息中,我们要怎样把上述信息装入集合中, 根据班级信息的到所有的所有信
package com.rf.xs; import java.util.Arrays; public class Student01 { String name; int age; public St ...
- Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks 阅读笔记
Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks (使用循环一致的对抗网络的非配对图像-图 ...
- shell中脚本与函数的使用策略
脚本:运行的副作用不影响父环境,开辟了fork子进程; 函数:副作用,定义的变量,数据默认直接添加到了调用者的环境,也是它自己的环境;不想副作用影响调用者环境,就必须主动用local修饰; shell ...
- 给大家介绍一个实用的RN神器DeviceEventEmitter
再不出来更新一下自己都感觉不到自己还存在了,这个监听最常用的地方莫过于单选和全选了,,当然远不止这个了,大家可以自己去多尝试几波,举个栗子 A组件全选所在 //全选 choose(bool){ //选 ...
- Labview-vi的可重入性
VI可重入性: labview多线程中 同时对一个子vi访问时,可能会造成同时对同一块内存地址读写所造成的数据混乱,当选择 vi属性(Ctrl+i)中执行选项卡允许可重入时,labview会分配不同的 ...
- Delphi编程之爬取贴吧帖子图片
大家如果经常在逛贴吧的时候,会看到很多帖子里有很多好看的图片,都想下载下来留存的话,常规的方法只能一张一张点击右键,然后图片另存为,这样的方法对于图片少的来说没什么,要是图片超过100张,200张,那 ...
- c语言 实验1
实验结论 Part 1 首次运行Part 1的几个实验内容时会产生错误,原因如下 有时忘记在主函数中的每行末尾加分号 return 0 时空格错误导致程序运行失败 # include <stdi ...
- 路径R
定义文件路径时前面加个r 例如 firstfolder = r"C:\Users\1261\Desktop\" 不对其中的符号进行转义