我在多個文件中使用單個命名空間,並且通過腳本(main除外)在每個文件的末尾插入了「namespace abc {」和「}」。因此'#include'出現在每個文件的命名空間下 當我編譯時,它不起作用(不識別系統功能等)。C++:'#include <files>'之前是否允許命名空間定義。
但是如果我在'#include'行之後定義命名空間,正常工作。 這裏有什麼問題嗎?
我在多個文件中使用單個命名空間,並且通過腳本(main除外)在每個文件的末尾插入了「namespace abc {」和「}」。因此'#include'出現在每個文件的命名空間下 當我編譯時,它不起作用(不識別系統功能等)。C++:'#include <files>'之前是否允許命名空間定義。
但是如果我在'#include'行之後定義命名空間,正常工作。 這裏有什麼問題嗎?
#include
線命名空間定義之前應該去,否則你可能會得到意想不到的效果。預處理語言與C/C++代碼不同,混合後可能會產生難以跟蹤的錯誤。
問題是,通過將標題放在命名空間中,您可以讓它們在該命名空間中聲明函數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函數。
我相信這不完全正確。如果你這樣做,那麼你仍然必須使用x :: printf。但是,那仍然會連接OK,因爲外部的「C」會影響名稱的修改。 – 2012-03-07 07:52:09
Thanx Alexander, 實際上,有很多文件,並且手動在每個文件中插入名稱空間定義(即在預處理器聲明之後)將是一件困難的工作。這就是爲什麼我在開始時通過腳本插入它們。 – Dharmendra 2012-03-07 07:40:26