[Development] Using #pragma once

Thiago Macieira thiago.macieira at intel.com
Sun Oct 7 20:39:22 CEST 2018


On Sunday, 7 October 2018 01:56:47 PDT Lars Knoll wrote:
> Hi,
> 
> Just a quick question: Does anybody have any good arguments against us
> starting to use #pragma once instead of header guards throughout our code
> base?

Yes, two:

a) not supported everywhere
b) not well-defined behaviour when it comes to anything but the simplest 
organisation

For example, I have ~/src as a bind-mount to ~/dev/src. That means 
	~/src/qt/qt5/qtbase/src/corelib/global/qglobal.h
	~/dev/src/qt/qt5/qtbase/src/corelib/global/qglobal.h
are actually the same file, but they aren't for the effects of #pragma once 
because the paths differ.

Another problem is qcompilerdetection.h, qprocessordetection.h, 
qsystemdetection.h, qtypeinfo.h, etc. which depend on the header guards to 
break the include cycle. Ditto for qlist.h + qstringlist.h and 
qbytearraylist.h

> I’ve started using it implicitly when updating 3rd party code (the macro
> assembler) in qtdeclarative without any problems (so I’d supported by all
> our compilers). IMO #pragma once is both safer and nicer to use than
> classic header guards.

On all the compilers that compile that macro assembler. We still have 
architectures where they don't.

Another aspect is that the macro assembler headers don't get installed and 
aren't subject to syncqt.pl, so their hierarchy is a lot simpler than for Qt's 
own headers.

I recommend against changing Qt.

-- 
Thiago Macieira - thiago.macieira (AT) intel.com
  Software Architect - Intel Open Source Technology Center






More information about the Development mailing list