gcc -E 预编译模板类

原创 2015年11月19日 21:17:24
gcc -E 预编译模板类


需要的文件数:
simple-> ls
app.cpp  app.h  make.sh  temp.h  type.h
simple->


1) type.h
simple-> cat type.h
/// @file type.h
/// @brief 
/// @author EastonWoo
/// 0.01
/// @date 2015-11-19


#pragma once

#define MACRO_JOIN( X, Y ) MACRO_DO_JOIN( X, Y )
#define MACRO_DO_JOIN( X, Y ) MACRO_DO_JOIN2(X,Y)
#define MACRO_DO_JOIN2( X, Y ) X##Y

2) temp.h
simple-> cat temp.h
/// @file temp.h
/// @brief 
/// @author EastonWoo 
/// 0.01
/// @date 2015-11-19


// #pragma once   // 这个不能要, 因为这个文件相当于inline

#include "type.h"

#define SIGNAL_SIGNAL MACRO_JOIN(TSignal, SIGNAL_NUMBER)

#if (SIGNAL_NUMBER != 0)
template <SIGNAL_CLASS_TYPES>
#endif
class SIGNAL_SIGNAL
{
public:
    T3 add (T1 a, T2 b) {
        return (a + b);
    }
private:
    T1 m_t1;
    T2 m_t2;
    T3 m_t3;
};


#undef SIGNAL_SIGNAL

3) app.h
simple-> cat app.h
/// @file app.h
/// @brief 
/// @author EastonWoo 
/// 0.01
/// @date 2015-11-19


#pragma once

// TSignal1
#define SIGNAL_NUMBER 1
#define SIGNAL_CLASS_TYPES typename T1, typename T2, typename T3
#include "temp.h"
#undef  SIGNAL_NUMBER
#undef  SIGNAL_CLASS_TYPES

// TSignal2
#define SIGNAL_NUMBER 2
#define SIGNAL_CLASS_TYPES typename T1, typename T2, typename T3
#include "temp.h"
#undef  SIGNAL_NUMBER
#undef  SIGNAL_CLASS_TYPES

4) app.cpp
simple-> cat app.cpp
/// @file app.cpp
/// @brief 
/// @author EastonWoo 
/// 0.01
/// @date 2015-11-19

#include <stdio.h>
#include <string>

#include "app.h"

int main(int argc, const char *argv[])
{
    TSignal1<int, int, int>* signal1 = new TSignal1<int, int, int>;
    int iret = signal1->add(1, 2);
    printf("iret = %d\n", iret);

    TSignal2<std::string, std::string, std::string>* signal2 = new TSignal2<std::string, std::string, std::string>;
    std::string sret = signal2->add("hello ", "world");
    printf("sret = %s\n", sret.c_str());
    return 0;
}

5) make.sh
simple-> cat make.sh
#!/bin/bash - 
#===============================================================================
#
#          FILE: make.sh
# 
#         USAGE: ./make.sh 
# 
#   DESCRIPTION: 
# 
#       OPTIONS: ---
#  REQUIREMENTS: ---
#          BUGS: ---
#         NOTES: ---
#        AUTHOR: YOUR NAME (), 
#  ORGANIZATION: 
#       CREATED: 11/19/2015 20:29
#      REVISION:  ---
#===============================================================================

set -o nounset                              # Treat unset variables as an error

g++ -std=c++0x app.cpp -o app && ./app

6) 运行:
simple-> sh make.sh
iret = 3
sret = hello world
simple->

7) gcc -E app.h
simple-> gcc -E app.h 
# 1 "app.h"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "app.h"







app.h:8:9: warning: #pragma once in main file
 #pragma once
         ^
       




# 1 "temp.h" 1
# 10 "temp.h"
# 1 "type.h" 1







       
# 11 "temp.h" 2




template <typename T1, typename T2, typename T3>

class TSignal1
{
public:
    T3 add (T1 a, T2 b) {
        return (a + b);
    }
private:
    T1 m_t1;
    T2 m_t2;
    T3 m_t3;
};
# 14 "app.h" 2






# 1 "temp.h" 1
# 15 "temp.h"
template <typename T1, typename T2, typename T3>

class TSignal2
{
public:
    T3 add (T1 a, T2 b) {
        return (a + b);
    }
private:
    T1 m_t1;
    T2 m_t2;
    T3 m_t3;
};
# 21 "app.h" 2



C/C++的预编译和宏定义

预编译是整个编译过程的第一步,是g++ -E选项输出的结果。 这个步骤处理的是源文件/头文件中的宏,宏指令常用的有以下几类: 文件包含:#include宏定义:#define、#undef条件...

Libgdx中ScrollPane和Actor事件冲突问题的解决方案

在Libgdx的使用过程中,经常会用到ScrollPane这个widget,来实现滑动效果, 如下所示: 但是如果想在上面的效果上添加一点扩展,比如ScrollPane中的Actor可以从Scrol...

ubuntu17.04或linux4.0.x安装VMware,VMware启动失败解决办法

下载VMware 手动下载地址: 地址:http://www.vmware.com/go/tryworkstation-linux-64 linux命令下载: $ wget http://ww...

gcc -E 产生预编译后的文件

利用gcc -E选项,可以得到预编译后的文件。这可以得到宏展开后的文件。 先来看看几个相关联的文件吧! #ifndef __DEFS_H__ #define __DEFS_H__ #ifde...

gcc的bug? c++模板类中友元函数的访问权限问题

在c++中,模板类中可以直接定义一个友元函数,

GCC预编译(代码加说明)

  • 2013年04月17日 18:46
  • 234KB
  • 下载

<转> 模板类 声明和定义 编译 c++

如何组织编写模板程序  前言 常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”。看看我们几乎每天都能遇到的模板类吧,如STL, ATL, WTL, ...

C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译?

著作权归作者所有。 商业转载请联系作者获得授权,非商业转载请注明出处。 作者:余天升 链接:http://www.zhihu.com/question/20630104/answer/15722...

各位大牛帮忙看看问题出来哪?自己实现一个数组模板类,编译无法通过

大家帮忙查查问题出在哪? 目的:自己实现一个数组模板类,并重载+、=、[]、...
  • OKVSA
  • OKVSA
  • 2017年04月21日 20:29
  • 167

C++模板类(方法)分离编译问题

模板类(函数)的分离编译(Separate compile)问题          模板是一把双刃剑,Template的出现极大的简化了代码的重复,同时也增加了阅读代码的难度。很多复杂的Templa...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:gcc -E 预编译模板类
举报原因:
原因补充:

(最多只允许输入30个字)