gcc -E 预编译模板类
需要的文件数:
simple-> ls
app.cpp app.h make.sh temp.h type.h
simple->
1) type.h
simple-> cat type.h
2) temp.h
simple-> cat temp.h
3) app.h
simple-> cat app.h
4) app.cpp
simple-> cat app.cpp
5) make.sh
simple-> cat make.sh
6) 运行:
simple-> sh make.sh
iret = 3
sret = hello world
simple->
7) gcc -E app.h
需要的文件数:
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