I disagree. The bottom line is that the programmer has to understand what will happen when any given input file is fed to the compiler. Introducing #pragma's (which are a standard means of allowing compiler specific extensions) to work around lack of programmer understanding is not a particularly good approach.
The basic issue here is that the preprocessor works by doing text substitution, whereas the C++ (and C) language are token based. The advocates of things like #pragma once tend to incorrectly assume the preprocessing phase honours rules of the language accepted by the compilation phase (hence the fact that such things affect lexical analysis by the compiler).
The real solution is either to properly understand the preprocessor (include guards are something quite consistent with how the preprocessor works) or for the language to include some scheme other than the preprocessor for separating declarations from definitions (which happens with a number of languages other than C or C++). Both approaches have their trade-offs, despite each having strong advocates.