私は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
機能でグローバルな名前空間を汚染します。
Visual Studioを使用してWindowsでコンパイルする際に、これらの問題に直面していないことに注意してください。
「ランダム」は、**標準のCライブラリの**一部ではありません。それは問題が本当ではないと言っているわけではありません。 –
@PeteBecker実際、POSIX(http://pubs.opengroup.org/onlinepubs/9699919799/functions/random.html)から来ます。これは、C標準の名前だけでなく、POSIXのすべてのものにも注意する必要があります。 :( –