`
raojl
  • 浏览: 208464 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

编译校验【代码笔记】

阅读更多

 

1、版本编译控制(比如多项目)

2、编译校验

3、static_cast

----------------------------------------------------------

 

// static_check.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <string>

using namespace std;

namespace Loki
{
////////////////////////////////////////////////////////////////////////////////
// Helper structure for the STATIC_CHECK macro
////////////////////////////////////////////////////////////////////////////////

    template<int> struct CompileTimeError;
    template<> struct CompileTimeError<true> {};
}

////////////////////////////////////////////////////////////////////////////////
// macro STATIC_CHECK
// Invocation: STATIC_CHECK(expr, id)
// where:
// expr is a compile-time integral or pointer expression
// id is a C++ identifier that does not need to be defined
// If expr is zero, id will appear in a compile-time error message.
////////////////////////////////////////////////////////////////////////////////

#define STATIC_CHECK(expr, msg) \
    { Loki::CompileTimeError<((expr) != 0)> ERROR_##msg; (void)ERROR_##msg; } 

int _tmain(int argc, _TCHAR* argv[])
{
	STATIC_CHECK((sizeof(int) == 4 && sizeof(long) == 4), 32bit);
	STATIC_CHECK((sizeof(int) != sizeof(long)), 64bit);
	return 0;
}

  ////////////////////////////////////////////////////////////////////////////////

// The Loki Library
// Copyright (c) 2001 by Andrei Alexandrescu
// This code accompanies the book:
// Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design 
//     Patterns Applied". Copyright (c) 2001. Addison-Wesley.
// Permission to use, copy, modify, distribute and sell this software for any 
//     purpose is hereby granted without fee, provided that the above copyright 
//     notice appear in all copies and that both that copyright notice and this 
//     permission notice appear in supporting documentation.
// The author or Addison-Welsey Longman make no representations about the 
//     suitability of this software for any purpose. It is provided "as is" 
//     without express or implied warranty.
////////////////////////////////////////////////////////////////////////////////

// Last update: November 22, 2001

#ifndef TYPEMANIP_INC_
#define TYPEMANIP_INC_

namespace Loki
{
////////////////////////////////////////////////////////////////////////////////
// class template Int2Type
// Converts each integral constant into a unique type
// Invocation: Int2Type<v> where v is a compile-time constant integral
// Defines 'value', an enum that evaluates to v
////////////////////////////////////////////////////////////////////////////////

    template <int v>
    struct Int2Type
    {
        enum { value = v };
    };
    
////////////////////////////////////////////////////////////////////////////////
// class template Type2Type
// Converts each type into a unique, insipid type
// Invocation Type2Type<T> where T is a type
// Defines the type OriginalType which maps back to T
////////////////////////////////////////////////////////////////////////////////

    template <typename T>
    struct Type2Type
    {
        typedef T OriginalType;
    };
    
////////////////////////////////////////////////////////////////////////////////
// class template Select
// Selects one of two types based upon a boolean constant
// Invocation: Select<flag, T, U>::Result
// where:
// flag is a compile-time boolean constant
// T and U are types
// Result evaluates to T if flag is true, and to U otherwise.
////////////////////////////////////////////////////////////////////////////////

    template <bool flag, typename T, typename U>
    struct Select
    {
        typedef T Result;
    };
    template <typename T, typename U>
    struct Select<false, T, U>
    {
        typedef U Result;
    };
    
////////////////////////////////////////////////////////////////////////////////
// class template IsSameType
// Return true iff two given types are the same
// Invocation: SameType<T, U>::value
// where:
// T and U are types
// Result evaluates to true iff U == T (types equal)
////////////////////////////////////////////////////////////////////////////////

    template <typename T, typename U>
    struct IsSameType
    {
        enum { value = false };
    };
    
    template <typename T>
    struct IsSameType<T,T>
    {
        enum { value = true };
    };

////////////////////////////////////////////////////////////////////////////////
// Helper types Small and Big - guarantee that sizeof(Small) < sizeof(Big)
////////////////////////////////////////////////////////////////////////////////

    namespace Private
    {
        template <class T, class U>
        struct ConversionHelper
        {
            typedef char Small;
            struct Big { char dummy[2]; };
            static Big   Test(...);
            static Small Test(U);
            static T MakeT();
        };
    }

////////////////////////////////////////////////////////////////////////////////
// class template Conversion
// Figures out the conversion relationships between two types
// Invocations (T and U are types):
// a) Conversion<T, U>::exists
// returns (at compile time) true if there is an implicit conversion from T
// to U (example: Derived to Base)
// b) Conversion<T, U>::exists2Way
// returns (at compile time) true if there are both conversions from T
// to U and from U to T (example: int to char and back)
// c) Conversion<T, U>::sameType
// returns (at compile time) true if T and U represent the same type
//
// Caveat: might not work if T and U are in a private inheritance hierarchy.
////////////////////////////////////////////////////////////////////////////////

    template <class T, class U>
    struct Conversion
    {
        typedef Private::ConversionHelper<T, U> H;
#ifndef __MWERKS__
        enum { exists = sizeof(typename H::Small) == sizeof((H::Test(H::MakeT()))) };
#else
        enum { exists = false };
#endif
        enum { exists2Way = exists && Conversion<U, T>::exists };
        enum { sameType = false };
    };
    
    template <class T>
    struct Conversion<T, T>    
    {
        enum { exists = 1, exists2Way = 1, sameType = 1 };
    };
    
    template <class T>
    struct Conversion<void, T>    
    {
        enum { exists = 0, exists2Way = 0, sameType = 0 };
    };
    
    template <class T>
    struct Conversion<T, void>    
    {
        enum { exists = 0, exists2Way = 0, sameType = 0 };
    };
    
    template <>
    struct Conversion<void, void>    
    {
    public:
        enum { exists = 1, exists2Way = 1, sameType = 1 };
    };

////////////////////////////////////////////////////////////////////////////////
// class template SuperSubclass
// Invocation: SuperSubclass<B, D>::value where B and D are types. 
// Returns true if B is a public base of D, or if B and D are aliases of the 
// same type.
//
// Caveat: might not work if T and U are in a private inheritance hierarchy.
////////////////////////////////////////////////////////////////////////////////

template <class T, class U>
struct SuperSubclass
{
  enum { value = (::Loki::Conversion<const volatile U*, const volatile T*>::exists &&
                  !::Loki::Conversion<const volatile T*, const volatile void*>::sameType) };
};

////////////////////////////////////////////////////////////////////////////////
// class template SuperSubclassStrict
// Invocation: SuperSubclassStrict<B, D>::value where B and D are types. 
// Returns true if B is a public base of D.
//
// Caveat: might not work if T and U are in a private inheritance hierarchy.
////////////////////////////////////////////////////////////////////////////////

template<class T,class U>
struct SuperSubclassStrict
{
  enum { value = (::Loki::Conversion<const volatile U*, const volatile T*>::exists &&
                 !::Loki::Conversion<const volatile T*, const volatile void*>::sameType &&
                 !::Loki::Conversion<const volatile T*, const volatile U*>::sameType) };
};

}   // namespace Loki

////////////////////////////////////////////////////////////////////////////////
// macro SUPERSUBCLASS
// Invocation: SUPERSUBCLASS(B, D) where B and D are types. 
// Returns true if B is a public base of D, or if B and D are aliases of the 
// same type.
//
// Caveat: might not work if T and U are in a private inheritance hierarchy.
// Deprecated: Use SuperSubclass class template instead.
////////////////////////////////////////////////////////////////////////////////

#define SUPERSUBCLASS(T, U) \
    ::Loki::SuperSubclass<T,U>::value

////////////////////////////////////////////////////////////////////////////////
// macro SUPERSUBCLASS_STRICT
// Invocation: SUPERSUBCLASS(B, D) where B and D are types. 
// Returns true if B is a public base of D.
//
// Caveat: might not work if T and U are in a private inheritance hierarchy.
// Deprecated: Use SuperSubclassStrict class template instead.
////////////////////////////////////////////////////////////////////////////////

#define SUPERSUBCLASS_STRICT(T, U) \
    ::Loki::SuperSubclassStrict<T,U>::value

////////////////////////////////////////////////////////////////////////////////
// Change log:
// June 20, 2001: ported by Nick Thurn to gcc 2.95.3. Kudos, Nick!!!
// November 22, 2001: minor change to support porting to boost
// November 22, 2001: fixed bug in Conversion<void, T>
//      (credit due to Brad Town)
// November 23, 2001: (well it's 12:01 am) fixed bug in SUPERSUBCLASS - added
//      the volatile qualifier to be 100% politically correct
// September 16, 2002: Changed "const volatile" to "const volatile *", to enable
//     conversion to succeed. Done earlier by MKH.
//     Added SuperSubclass and SuperSubclassStrict templates. The corresponding
//     macros are deprecated.
//     Added extra parenthesis in sizeof in Conversion, to disambiguate function
//     call from function declaration. T.S.
////////////////////////////////////////////////////////////////////////////////

#endif // TYPEMANIP_INC_
 

 

分享到:
评论

相关推荐

    java之jvm学习笔记十而(访问控制器的栈校验机制)-步骤2源码

    6. **字节码优化**:现代JVM如HotSpot,会在运行时通过即时编译(JIT)对字节码进行优化,但优化前也会进行栈校验,以确保优化后的代码依然类型安全。 理解JVM的栈校验机制对于Java开发者来说非常有益,它可以帮助...

    C Primer Plus学习笔记

    《C Primer Plus学习笔记》是一份为初学者准备的学习资源,旨在帮助读者理解和掌握C语言的基础知识。笔记可能包含作者在学习过程中的一些个人理解...同时,读者应积极参与校验和补充笔记内容,以提升其准确性和完整性。

    编译原理学习资料.rar

    通常,PPT会详细讲解各个主题,如词法分析、语法分析、语义分析、错误处理、中间代码生成以及代码优化等。通过这些PPT,你可以系统地了解编译器的构造过程,包括LL解析、LR解析、上下文无关文法、正则表达式、巴科斯...

    Java注解笔记源代码

    3. **运行时校验**:JSR 303/JSR 349的Bean Validation使用注解进行数据校验。 4. **资源管理**:比如`@WebServlet`用于标注Servlet,`@EJB`用于注入Enterprise JavaBeans。 总结来说,Java注解是现代Java开发中一...

    c#学习笔记.txt

    c#学习笔记(1) 51099在线学习网发布 文章来源:网络收集 发布时间:2006-05-25 字体: [大 中 小] 51099在线学习网 http://www.51099.com 1, 结构(struct) 与 类(class) [attributes] [modifiers] struct ...

    毕向东Java笔记

    - 代码校验:由Bytecode Verifier完成。 - 执行代码:由Runtime Interpreter完成。 3. **Java运行环境**: - **JRE(Java Runtime Environment)**:包含了运行Java程序所需的Java虚拟机、核心类库和支持文件。 ...

    软件设计师笔记.pdf

    笔记还涵盖了程序语言基础知识、操作系统知识、网络基础知识、多媒体基础知识、数据库技术基础、数据结构、算法设计与分析、面向对象技术、标准化和软件知识产权基础、编译过程以及各类题型的解题技巧,如选择题、...

    java之jvm学习笔记十而(访问控制器的栈校验机制)

    尽管现代JVM通过即时编译(JIT)技术提高了性能,但在解释执行阶段的严格类型检查仍然保留,以保持代码的健壮性。 总之,Java的JVM通过访问控制器的栈校验机制确保了代码的类型安全和访问控制,这是Java平台可靠性...

    清华大学java学习笔记

    其次字节码校验器检查该类文件的代码中是否存在着某些非法操作,例如 applet 程序中写本机文件系统的操作;如果字节码校验器检验通过,由 Java 解释器负责把该类文件解释成为机器码进行执行。 Java 语言的特点 ...

    软件设计师笔记.docx

    * 编译过程:源程序---词法分析---语法分析---语义分析---中间代码生成---代码优化---目标代码生成---目标代码 * 解释程序:分析部分---词法分析、语法分析、语义分析---中间代码;解释部分---解释执行中间代码 九...

    ssh-aop笔记

    - **权限校验**:在方法调用前进行权限验证,避免在每个业务方法中重复代码。 **6. Struts与Hibernate的整合** Struts作为MVC框架负责处理用户请求,Hibernate则用于持久化数据。SSH整合中,通常通过Struts的...

    java学习笔记整理

    在安全性方面,Java代码需要通过编译、类装载检查和字节码校验,如果在网络上运行,还有沙箱保护,确保代码的安全执行。 构建Java企业版(JEE)开发环境时,需要安装JDK,并设置相应的环境变量,如Path、JAVA_HOME...

    毕向东java笔记

    - **编译与解释**:Java源代码编译成字节码,由JVM解释执行。 - **运行过程**:加载、校验、解释执行三个步骤。 3. **Java运行环境**: - **JRE**:Java运行环境,包括JVM、库函数等,用于运行Java应用程序和...

    java计算机二级考试笔记.pdf

    * JVM(Java 虚拟机)的功能是:校验代码 - 编译代码 —&gt; 运行代码 * 字符输入流直接父类是 Reader,字符输出流直接父类是 Writer ;字节输入流直接父类是 InputStream,字节输出流的直接父类是 OutputStream

    Android模拟串口与笔记本通信

    2. 打开串口:选择合适的串口号,设置波特率、数据位、停止位和校验位,然后打开串口。 3. 发送数据:通过串口对象提供的write()方法,将数据写入串口,发送到对方设备。 4. 接收数据:注册监听器,当有数据到来时,...

    若依RuoYi框架剖析笔记,该笔记是在学习江南一点雨所录课程再结合自己的理解所写

    11、**自定义注解+AOP**:通过自定义注解和AOP切面编程,可以实现更灵活的功能扩展,比如行为审计或权限校验。 12、**权限概念梳理**:深入理解角色、资源、权限等概念,构建清晰的权限模型。 13、**登录授权流程...

    java学习笔记源码MD.rar

    JVM是Java程序运行的基础,它负责将编译后的字节码转化为机器语言,实现了“一次编写,到处运行”的理念。了解JVM的工作原理,包括类加载机制、内存模型(堆、栈、方法区等)、垃圾收集机制等,能帮助开发者优化...

    Java_se基础毕向东老师全程笔记

    - **编译器**:将源代码编译成字节码,文件扩展名为`.class`。 - **Java虚拟机(JVM)**:解释执行字节码。 #### 3. Java运行时环境JRE与JDK - **JRE**:包括Java虚拟机、库函数以及其他必需的文件。 - **JDK**:除了...

    软考中级软件设计师笔记.zip

    软考中级软件设计师学习笔记 World版本 下载后可直接打印作为2020年上半年考试的复习资料用 1.CPU 的功能的功能:程序控制、操作控制、时间控制、数据处理。 2.计算机系统组成示意图计算机系统组成示意图: 3....

    java-SE-马士兵笔记word

    ### Java SE - 马士兵笔记精要 #### 第1章 Java概述 - **Java语言的特点**: - **面向对象**:Java是一种完全支持面向对象编程的语言。 - **平台无关性**:通过Java虚拟机(JVM),Java可以在任何安装了JVM的...

Global site tag (gtag.js) - Google Analytics