2012-03-07 46 views
3

我在多個文件中使用單個命名空間,並且通過腳本(main除外)在每個文件的末尾插入了「namespace abc {」和「}」。因此'#include'出現在每個文件的命名空間下 當我編譯時,它不起作用(不識別系統功能等)。C++:'#include <files>'之前是否允許命名空間定義。

但是如果我在'#include'行之後定義命名空間,正常工作。 這裏有什麼問題嗎?

回答

1

#include線命名空間定義之前應該去,否則你可能會得到意想不到的效果。預處理語言與C/C++代碼不同,混合後可能會產生難以跟蹤的錯誤。

+0

Thanx Alexander, 實際上,有很多文件,並且手動在每個文件中插入名稱空間定義(即在預處理器聲明之後)將是一件困難的工作。這就是爲什麼我在開始時通過腳本插入它們。 – Dharmendra 2012-03-07 07:40:26

5

問題是,通過將標題放在命名空間中,您可以讓它們在該命名空間中聲明函數espace - 但這些函數的定義(實現)不存在於該名稱空間中,因此當您鏈接時,將無法找到它們,並且鏈接失敗。

舉一個具體的例子,假設你有一個頭部聲明瞭一個函數int f(int)。通過在花括號裏面加入一個命名空間,你可以把它變成int somenamespace::f(int)的聲明。

雖然int ::f(int)已被定義,int somenamespace::f(int)還沒有,所以你不能鏈接。

請注意,這不適用於extern "C"函數。他們基本上忽略的命名空間,所以(例如)類似:

namespace x { 
    #include <stdio.h> 
} 

不會影響stdio.h正常的C函數。

+0

我相信這不完全正確。如果你這樣做,那麼你仍然必須使用x :: printf。但是,那仍然會連接OK,因爲外部的「C」會影響名稱的修改。 – 2012-03-07 07:52:09

相關問題