学习了一次#pragma在C语言中的作用~

 2024-02-21 03:02:13  阅读 0

1.#once的作用是什么?

为了避免同一个头文件被多次(),C/C++中有两种宏实现方法:一是#方法;二是#方法。 另一种是#once方法。

在可以支持这两种方法的编译器上,两者没有太大区别。 但两者之间仍然存在一些微妙的差异。

2、两种使用方法有什么区别?

示例代码如下:

//方式一:
#ifndef  __SOMEFILE_H__
#define   __SOMEFILE_H__
 ... ... // 声明、定义语句
#endif

//方式二:
#pragmaonce
 ... ... // 声明、定义语句

3、(1)各有什么特点#

C/C++语言标准支持#方法。 它不仅可以确保同一个文件不会被多次包含,而且还可以确保两个内容完全相同的文件(或代码片段)不会被意外同时包含。

当然,缺点是,如果不同头文件中的宏名称不小心“冲突”,你可能会看到头文件明明存在,但编译器却坚持找不到声明的情况——这种情况有时非常令人沮丧。 郁闷。

c语音头文件_c.语言头文件_c语言头文件的作用

由于编译器每次都需要打开头文件来判断是否存在重复定义,所以在编译大型项目时,编译时间会比较长,所以一些编译器逐渐开始支持#once方法。

(2)#一次

# 一次一般由编译器保证:同一个文件不会被多次包含。 注意,这里所说的“同一文件”是指一个物理文件,而不是两个内容相同的文件。

您不能对头文件中的一段代码进行一次语句,而只能对文件进行一次语句。

好处是不再需要担心宏名称冲突,当然也不会出现因宏名称冲突而引起的奇怪问题。 大型项目的编译速度也得到了提高。

相应的缺点是,如果一个头文件有多个副本,该方法不能保证它们不会被重复包含。 当然,相比于宏名称冲突导致的“声明未找到”问题,这种重复包含很容易被发现并纠正。

另外,该方法不支持跨平台!

4.两者之间有什么联系?

c语音头文件_c.语言头文件_c语言头文件的作用

#once方法是在#之后创建的,所以很多人可能根本没有听说过它。 目前看来#更受推崇。 因为#是C/C++语言标准支持的,不受编译器的任何限制;

一些旧版本的编译器不支持#once方法,并且一些支持的编译器计划将其删除,因此它的兼容性可能不够好。

一般来说,程序员听到这个,都会选择#方法。 为了尝试让他们的代码“生存”得更久,他们通常宁愿降低一些编译性能。 这就是程序员的个性。 当然,这是题外话。 。

我还看到了将两者放在一起的用法:

#pragma once
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__

... ... // 声明、定义语句

#endif

总结:

它似乎想要两全其美。 不过,只要使用#,就有宏名冲突的风险,而且不支持#一次的编译器也难免会报错,所以混合两种方式似乎并没有带来更多的好处,反而会带来更多的好处。让一些不熟悉的人感到困惑。 。

选择哪种方法应根据具体情况确定,并了解这两种方法。 只要有一个合理的约定,避免缺点,我认为任何一种方法都是可以接受的。 这不再是标准或编译器的责任。 应该由程序员自己处理或者是小规模的开发规范。

为避免同一文件被多次使用:

1.#方法

2.#once方法

就能够支持这两种方式的编译器而言,两者并没有太大的区别,但两者还是存在一些细微的差别。

方式一:

#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... ... // 一些声明语句
#endif

方式二:

#pragma once
... ... // 一些声明语句

# 方法依赖于宏名称不能冲突的事实。 这样不仅可以保证同一个文件不会被多次包含,也可以保证两个内容完全相同的文件不会被意外同时包含。 当然,缺点是,如果不同头文件的宏名不小心“冲突”,可能会导致头文件明明存在,编译器却坚持找不到声明的情况。

# 编译器保证一次:同一个文件不会被多次包含。 注意,这里所说的“同一文件”是指一个物理文件,而不是两个内容相同的文件。 好处是你不再需要去想宏名,当然也不会出现宏名冲突引起的奇怪问题。

相应的缺点是,如果一个头文件有多个副本,该方法不能保证它们不会被重复包含。 当然,相比宏名冲突导致的“声明未找到”问题,重复包含更容易被发现和纠正。

第一种方法有语言支持,因此具有良好的可移植性。 第二种方法可以避免名称冲突。

文章素材来源csdn

标签: 编译 文件 包含

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码