2012年9月8日土曜日

Precompiled Header


用VC新建个project,总是会有stdafx.h/cpp文件自动生成,只知道是预编译文件,但是预编译文件到到底是个什么东西,一直也没试着搞清楚。今天,搞清楚。

什么是预编译头文件

C/C++的编译器,会在预处理时把头文件include到源文件(source file)里。由于很多library都含有很大个的头文件,尤其是使用template的,不提供点什么机制的话,每次编译时都会重新编译这些头文件,非常inefficient。

Precompiled Header就是编译器为了解决这个问题提供的机制。
用户可以将一些很少改动的头文件指定为预编译头文件,这样编译器会在第一次编译时对这些头文件生成某种中间形式的文件。VC是.pch, GNU Compiler Collection(gcc) 是.gch。这些文件是可以被各个编译单元共享的,并且是可以更快的被编译器处理的。

取代头文件里的include和前置声明

//A.h
class A
{
};
//B.h
class B
{
  A  *a;
};
//main.cpp
#include "A.h"
#include "B.h"
void main()
{
}
上面的source,编译是不通过的。因为B.h里没有include A.h。但是include A.h的话,A.h一旦改变,B这个class也会被重新编译。在B.h里前置声明A是通常的做法。但是如果B里使用的是A的对象,而不是指针的话,就不能这么做了。

使用预编译头文件的话,可以省去前置声明。
//main.cpp
#include "stdafx.h"
void main()
{
}
//stdafx.h
#pragma once
#include "A.h"
#include "B.h"

编译option里,对main.cpp指定/Yu'stdafx.h',表示对main.cpp使用预编译头文件。
这样的话,A.h和B.h会被预编译到.pch里,main.cpp会使用这个.pch。

预编译头文件的更新

上面其实隐藏着一个问题:如果B里用到的是A的实例的话,A.h一旦改变,B这个class,以及main.cpp都应当重新编译的。如果如上述这样使用了预编译头文件,A.h改变后,没有任何东西会被重新编译。这是因为对main.cpp指定的是Yu,即使用,而不是生成.pch,所以估计VC会忽视stdafx.h以及被它所include的A.h和B.h的timestamp。

VC其实是这么做的,默认的,还会有一个stdafx.cpp。
//stdafx.cpp
#include "stdafx.h"

这个文件的编译option是/Yc 'stdafx.h',也就是生成预编译头文件。对这个option,VC不会忽略其include的文件的timestamp,所以,一旦A.h发生了变化,这个文件及它所include的头文件都会被重新编译,重新生成.pch。

gcc的话,没有这样的option。编译器所作的只是在编译头文件之前先去找和头文件名称相同的.gch文件而已。和其他obj文件一样,预编译头文件的更新,通过makefile做。




2012年3月28日水曜日

日本語文型-その1

※摘自《王立日本语文型》,及《大辞林》

~共に

年をとると共に、体が弱ってきた。

~を通して / ~を通じて

シンガポールは一年を通して暑いところだ。

~にかわって / ~にかわり

父にかわってお客さんを案内する。

~っぽい /  ~っぽさ

年をとると、怒りっぽくなる。

~につれて / ~につれ

暗くなるにつれて、星がだんだん見えてきました。

何だか

プロレスの試合を見ていると、何だか興奮しちゃって、ついつい大声で声援を送ってしまうんです。

※何だか、なぜか、なんとなく、なにやら

どうも

1)いろいろ努力しても。できるだけやってみても。

どうもうまくいかない。
2)原因・理由が判然としない。
どうも変だと思った。
3)感謝や謝罪の気持ちを表す挨拶の語に添えて、その意を強調する。
どうもご苦労さまでした。

~に対して / ~に対し / ~に対しては / ~に対しても / ~に対する

目上の人に対しては敬語を使うものだ。
兄が大人しいのに対し、弟は活発だ。
消費税は一万円に対し五百円だ。

~ぶり

それは二十年ぶりの再会だった。
あの話しぶりでは、英語を6年間学んだと主張しても信じてもらえないだろう。
経営ぶり/生活ぶり


~から~かけて

九州から四国にかけて、高潮の恐れがあります。
大学の入学試験は、ふつう二月から三月にかけて行われる。

~だって

a. ある特別と思われる場合を挙げて、それも他と同様であるということを表す。
サルだって木から落ちる。
今すぐだっていいよ。
b. いくつかの物事を代表として例示し、他もそれと同様であるということを表す。
だって、僕だって、みんな仲間だ。
新宿だって、銀座だって、君の好きなところでいいよ。
c. 不定称の指示語につき、肯定の語と呼応して、全面的な肯定を表す。
だれだっていけるところだ。
いくらだってあるさ。
d. 不定称の指示語、数量・程度を表す語などに付いて、否定の語と呼応して、全面的な否定を表す。
だれだって死にたくない。
いっぺんだって来たことない。


~たって

a. 動詞・形容詞の連用形につき、「たとえ・・・ても」の意を表す。
今頃学校へ行ったって、だれもいないよ。
いまさら悔やんだって、はじまらない。
b. 活用語の終止形につき、「…といっても」「…としても」の意で、強い逆接を表す。
普段元気だったって、いつ病気になるかしれない。
逃げようったって、逃がさないよ。
旅行ったって、ちょっと伊豆の温泉へいってくるだけだ。

~だろうが~だろうが

だろうが、山だろうがどこへでも連れて行ってあげるよ。