# Ifndef and # pragma once are different

Source: Internet
Author: User

To prevent the same file from being included multiple times, there are two methods in C/C ++: # ifndef and # pragma once. There is no big difference between compilers that support these two methods, but there are still some minor differences between the two.
Method 1:

# Ifndef _ somefile_h __
# DEFINE _ somefile_h __
... // Some declaration statements
# Endif

Method 2:

# Pragma once
... // Some declaration statements

# The ifndef method depends on the macro name and cannot conflict with each other. This not only ensures that the same file is not included multiple times, but also ensures that two files with identical content are not accidentally included at the same time. Of course, the disadvantage is that if the macro names of different header files are accidentally "crashed", the header files may obviously exist, but the compiler can hardly find the declaration-this situation is sometimes very frustrating.
# Pragma once is guaranteed by the compiler: the same file will not be contained multiple times. Note that the "same file" here refers to a physical file, not two files with the same content. The advantage is that you don't have to think about a macro name any more. Of course, there won't be any strange problems caused by the macro name collision. The disadvantage is that if a header file has multiple copies, this method cannot ensure that it is not repeatedly included. Of course, repeat inclusion is easier to detect and correct than the "no declaration found" problem caused by macro name collision.
# The Pragma once method is generated after # ifndef, so many people may not even have heard of it. At present, it seems that # ifndef is more respected. Because # ifndef is naturally supported by the language and is not limited by the compiler; while # The Pragma once method is not supported by earlier versions of compilers. In other words, its compatibility is not good enough. Maybe it's not a problem to wait a few years until the old compiler is dead.
I also see a way to put the two together:

# Pragma once
# Ifndef _ somefile_h __
# DEFINE _ somefile_h __
... // Some declaration statements
# Endif

it seems that you want to have both advantages. However, if you use # ifndef, there will be a risk of macro name conflicts. Therefore, mixing the two methods does not seem to bring more benefits, but may confuse some unfamiliar people.
the method you choose depends on the actual situation. In fact, as long as there is a reasonable agreement to avoid disadvantages, I think it is acceptable. This is no longer the responsibility of the standard or compiler. It should be done by the Program .
BTW: some discussions on GNU seem to be intended in GCC 3.4 (and later ?) # Pragma once is supported. However, in my hands, GCC 3.4.2 and GCC 4.1.1 still support # pragma once, even without deprecation warning. Vc6 and later versions also support the # pragma once method. I think this feature has stabilized.

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.