The only caveat (as far as I can tell) is placement. Constructors are called in order and destructors in reverse order. If a different class constructor (or destructor) has to be protected, yours has to be first in the block...
{
NonAtomicBlock< Atomic_Force > a_NoBlock;
SuperHardwareThingy aThingy; // Constructor accesses hardware so it must be protected. It is protected because it comes after the line above.
}
If accidentally reversed, disaster ensues...
{
SuperHardwareThingy aThingy; // Constructor accesses hardware so it must be protected. Oops.
NonAtomicBlock< Atomic_Force > a_NoBlock;
}
The Libc macro does not have the same potential problem.