2009年9月23日

避免多重定義的技巧

有個header file裡面定義了一個class,而此header file同時被另外兩個cpp 檔include,而此三個檔案編譯之後預計產生一個object code。此時就會有重複宣告的問題。

@common.h
class base_class{...};

@util.h
#include "common.h"
...

@main.h
#include "common.h"
#include "util.h"
int main(){
...
}

在header file內加上 #ifndef, #define#endif可以解決這個問題,語法如下:

#ifndef

#define
... // header file內的所有source code
#endif

一般Label的規定為前後加上底線,字母全部大寫,並且把dot也變成底線,例如stdio.h:
#ifndef _STDIO_H_
#define _STDIO_H_
...
#endif

如此一來,preprocessor在展開source code的時候就不會有重複宣告的問題,因為util.cpp並不會include到common.h。建議是無論header file會不會被兩個以上的cpp include都加上macro,如此就可安心地include自己想要的header。

2009年9月16日

const member in class

假設有個class 裡面有個成員具備const屬性,則此const成員必須在initialization list內做初始化。

class A{
public:
A(){};
private:
const int constant1;
const int constant2;
};

A::A(): constant1(123), constant2(456)
{
...
}