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



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

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

GCC预编译(代码加说明)

  • 2013-04-17 18:46
  • 234KB
  • 下载

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

大家帮忙查查问题出在哪? 目的:自己实现一个数组模板类,并重载+、=、[]、<<等运算符,并完成对int、char及自定义类型的实现。 VS2010问题提示如下: error C2678: 二进制...
  • OKVSA
  • OKVSA
  • 2017-04-21 20:29
  • 122

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

模板类(函数)的分离编译(Separate compile)问题          模板是一把双刃剑,Template的出现极大的简化了代码的重复,同时也增加了阅读代码的难度。很多复杂的Templa...

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

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

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

如果把模板实现和定义分开,在模板类所在的编译单元里当然就不可能知道模板参数将是什么——int?char?甚至是用户自定义数据?——模板函数/类也就无从展开。很显然,相应的.o文件也就不可能包含所有这些...

为什么模板类不能支持分离编译

首先,C++标准中提到,一个编译单元[translation unit]是指一个.cpp文件以及它所include的所有.h文件,.h文件里的代码将会被扩展 到包含它的.cpp文件里,然后编译器...

模板类分开编译问题

关于模板类声明与实现分离(即声明放在.h文件,实现放在.cpp文件)的测试。 最近在写模板类的时候,分开编译模板声明和模板实现老实编译不过。看提示应该是链接不到实现的函数。 在网上查了一下...

c++中类模板、hpp文件、与预编译相关的#ifndef#define#endif 相关

*.hpp文件: 1、是Header   Plus   Plus 的简写。 2、与*.h类似,hpp是C++程序头文件 。 3、是VCL专用的头文件,已预编译。 4、是一般模板类的头文件。 5...

使用包含编译模型编译模板类时出现无法理解的错误

错误代码: 文件1:LinkedList.h //LinkedList.h templatetypename T> class LinkedList { public: LinkedList()...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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