程序文件和預處理器指令習題
共有4道題。
1,有一個程序調用了兩個函數print_this(const string& s)和print_that(const string& s),這兩個函數又調用第三個函數print(const string& s),輸出傳送給它的字符串。
在4個源文件中實現這3個函數和main()函數,并提供3個頭文件,分別包含print_this()、print_that()和print()的原型。確保頭文件只包含一次,main.cpp包含的#include語句數量最少。
2,修改上題的程序,使print()函數使用一個全局整數變量來計算它被調用的次數。在main()調用print_this()和print_that()后,輸出這個變量的值。
3,在print.h頭文件中,刪除print()的已有原型,再創(chuàng)建兩個命名空間print1和print2,每個命名空間都包含一個函數print(const string& s)。這些函數都有相同的函數簽名,區(qū)分它們的唯一方式是命名空間的名稱。在print.cpp文件中實現這兩個函數,輸出命名空間的名稱和字符串。
現在讓print_this()調用在命名空間print1中聲明的函數,讓print_that()調用在命名空間print2中聲明的函數。運行程序,驗證是否調用了正確的函數。
提示:從上面可以看出,在print_this()和print_that()中調用print()函數有三種不同的方式(即三種不同的語法形式)。
4,修改main()例程,只有定義了預處理器符號DO_THIS,才能調用print_this()。否則,就調用print_that()。
修改代碼,定義一個宏PRINT(),在定義了DO_THIS后,就讓PRINT(abc)——注意沒有引號——調用print_this("abc"),否則就調用print_that("abc")。
--------
4道題的代碼結構差不多,每道題都運用了一些C++的基本技巧:
有函數原型的聲明,頭文件的包含,避免重復定義,命名空間的使用,用預處理器指令來控制代碼塊等等技巧。
太懶了。
現貼出最終后一題的代碼,其它的都差不多。這些都是比較基礎,哈哈,我剛學C++幾個月,大家不要笑我。
把這些基礎的東西貼在這里,留著我以后復習。哈哈!

print.h
// print.h
#ifndef PRINT_H
#define PRINT_H

#include <iostream>
#include <string>
using std::string;


namespace print1
{
void print(const string& s);
}


namespace print2
{
void print(const string& s);
}

#endif

print.cpp
//print.cpp
#ifndef PRINT_CPP
#define PRINT_CPP

#include <iostream>
#include <string>
#include "print.h"

using std::cout;
using std::endl;
using std::string;


void print1::print(const string& s)
{
cout << "print1:print(): " << s << endl;
}


void print2::print(const string& s)
{
cout << "print2:print(): " << s << endl;
}

#endif

printthat.h
// printthat.h
#ifndef PRINTTHAT_H
#define PRINTTHAT_H

#include <iostream>
#include <string>
using std::string;

void print_that(const string& s);

#endif

printthat.cpp
//printthat.cpp
#ifndef PRINTTHAT_CPP
#define PRINTTHAT_CPP

#include <iostream>
#include <string>
#include "printthat.h"

#include "print.h"

using std::string;


void print_that(const string& s)
{
print2::print(s);
}

#endif

printthis.h
// printthis.h
#ifndef PRINTTHIS_H
#define PRINTTHIS_H

#include <iostream>
#include <string>
using std::string;

void print_this(const string& s);

#endif

printthis.cpp
// printthis.cpp
#ifndef PRINTTHIS_CPP
#define PRINTTHIS_CPP

#include <iostream>
#include <string>
#include "printthis.h"

#include "print.h"

using std::string;


void print_this(const string& s)
{
print1::print(s);
}

#endif

main.cpp
//main.cpp
#include <iostream>
#include <string>
using std::string;

#include "printthis.h"
#include "printthat.h"

//#define DO_THIS

#ifdef DO_THIS
#define PRINT(arg) print_this(#arg)
#else
#define PRINT(arg) print_that(#arg)
#endif


void main()
{
PRINT(abc);
}
1,有一個程序調用了兩個函數print_this(const string& s)和print_that(const string& s),這兩個函數又調用第三個函數print(const string& s),輸出傳送給它的字符串。
在4個源文件中實現這3個函數和main()函數,并提供3個頭文件,分別包含print_this()、print_that()和print()的原型。確保頭文件只包含一次,main.cpp包含的#include語句數量最少。
2,修改上題的程序,使print()函數使用一個全局整數變量來計算它被調用的次數。在main()調用print_this()和print_that()后,輸出這個變量的值。
3,在print.h頭文件中,刪除print()的已有原型,再創(chuàng)建兩個命名空間print1和print2,每個命名空間都包含一個函數print(const string& s)。這些函數都有相同的函數簽名,區(qū)分它們的唯一方式是命名空間的名稱。在print.cpp文件中實現這兩個函數,輸出命名空間的名稱和字符串。
現在讓print_this()調用在命名空間print1中聲明的函數,讓print_that()調用在命名空間print2中聲明的函數。運行程序,驗證是否調用了正確的函數。
提示:從上面可以看出,在print_this()和print_that()中調用print()函數有三種不同的方式(即三種不同的語法形式)。
4,修改main()例程,只有定義了預處理器符號DO_THIS,才能調用print_this()。否則,就調用print_that()。
修改代碼,定義一個宏PRINT(),在定義了DO_THIS后,就讓PRINT(abc)——注意沒有引號——調用print_this("abc"),否則就調用print_that("abc")。
--------
4道題的代碼結構差不多,每道題都運用了一些C++的基本技巧:
有函數原型的聲明,頭文件的包含,避免重復定義,命名空間的使用,用預處理器指令來控制代碼塊等等技巧。
太懶了。
現貼出最終后一題的代碼,其它的都差不多。這些都是比較基礎,哈哈,我剛學C++幾個月,大家不要笑我。
把這些基礎的東西貼在這里,留著我以后復習。哈哈!
// print.h
#ifndef PRINT_H
#define PRINT_H
#include <iostream>
#include <string>
using std::string;

namespace print1
{
void print(const string& s);
}

namespace print2
{
void print(const string& s);
}
#endif
//print.cpp
#ifndef PRINT_CPP
#define PRINT_CPP
#include <iostream>
#include <string>
#include "print.h"
using std::cout;
using std::endl;
using std::string;

void print1::print(const string& s)
{
cout << "print1:print(): " << s << endl;
}

void print2::print(const string& s)
{
cout << "print2:print(): " << s << endl;
}
#endif
// printthat.h
#ifndef PRINTTHAT_H
#define PRINTTHAT_H
#include <iostream>
#include <string>
using std::string;
void print_that(const string& s);
#endif
//printthat.cpp
#ifndef PRINTTHAT_CPP
#define PRINTTHAT_CPP
#include <iostream>
#include <string>
#include "printthat.h"
#include "print.h"
using std::string;

void print_that(const string& s)
{
print2::print(s);
}
#endif
// printthis.h
#ifndef PRINTTHIS_H
#define PRINTTHIS_H
#include <iostream>
#include <string>
using std::string;
void print_this(const string& s);
#endif
// printthis.cpp
#ifndef PRINTTHIS_CPP
#define PRINTTHIS_CPP
#include <iostream>
#include <string>
#include "printthis.h"
#include "print.h"
using std::string;

void print_this(const string& s)
{
print1::print(s);
}
#endif
//main.cpp
#include <iostream>
#include <string>
using std::string;
#include "printthis.h"
#include "printthat.h"
//#define DO_THIS
#ifdef DO_THIS
#define PRINT(arg) print_this(#arg)
#else
#define PRINT(arg) print_that(#arg)
#endif

void main()
{
PRINT(abc);
}
posted on 2009-02-18 16:26 luqingfei 閱讀(456) 評論(0) 編輯 收藏 引用 所屬分類: C++基礎

