我只使用特定於C++的頭文件(例如<cstdlib>
),但是我仍然獲得全局聲明的函數,而不僅僅是std
命名空間中的函數。有沒有辦法,也許是一個編譯器開關,以防止這種情況?防止std命名空間之外的標準函數
例如,下列代碼:
#include <cstdlib>
float random() { return 0.0f; }
int main() { return 0; }
失敗linux下進行編譯,用下面的錯誤:
> g++ -c main.cpp main.o
main.cpp: In function ‘float random()’:
main.cpp:2:14: error: new declaration ‘float random()’
/usr/include/stdlib.h:327:17: error: ambiguates old declaration ‘long int random()’
或
> clang++ main.cpp -o main.o
main.cpp:2:7: error: functions that differ only in their return type cannot be overloaded
float random() { return 0.0f; }
/usr/include/stdlib.h:327:17: note: previous declaration is here
extern long int random (void) __THROW;
其引起的stdlib.h
「污染「全球名稱空間與自己random
函數。
請注意,在Windows上使用Visual Studio進行編譯時,我沒有遇到這些問題。
請注意'隨機'是**不是** C標準庫的一部分。這並不是說問題不是現實的。 –
@PeteBecker事實上,它來自[POSIX](http://pubs.opengroup.org/onlinepubs/9699919799/functions/random.html)。使事情變得更有價值,不僅要注意C標準名稱,還要注意所有POSIX的東西。 :( –