#ifndef... #define与#pragma once总结

量化之趋势跟踪策略 趋势跟踪策略 import numpy as np import pandas as pd import matplotlib as mpl import matplotlib.pyplot as plt import seaborn as sns from finance import GetData import warnings; warnings.filterwarnings('ignore') data = GetData.get_data('../data/002236.csv') . 阅读详情

前几天看到同一个项目中有的地方使用了#ifndef...#define ...#endif,而有的地方却用了#pragma once,于是我就纠结了,这两者有神马区别呢?今天仔细查了一下,发现还是有一点点的区别,不过不大,简单记录一下。


一.简介

#ifndef ...#define ...#endif和#pragma once都是为了解决同一个问题的,就是防止头文件被重复包含和编译。这种宏定义都是作用于编译阶段,属于条件编译,控制编译流,可以让我们按照想要的方式来编译我们的代码。


二.#ifndef ...#define ...#endif

这个方法是最早期的使用方法,其实就是字面的理解,ifndef 是if not define的缩写,就是如果没有包含这个文件,那么包含这个文件,而如果包含了这个文件,那么在编译的时候,宏定义的条件不成立,就会跳过这个#define和#endif之间的内容。达到防止重复包含的作用。

//includetest头文件

#ifndef __INCLUDETEST_H_
#define __INCLUDETEST_H_

void TestFunc();

#endif
这样,如果有两个文件,都包含了TestFunc头文件,第一个如果被包含了,那么在下一次遇到#ifndef __INCLUDETEST_H_时,这个条件为假,下面的就不会再包含。

优点如下:

1.原生支持,适合跨平台。这种方法是语言本身支持的,在所有C++编译器上都可以支持。所以,如果是跨平台方式,最好使用这种方式,比较保险。

2.可以保证内容相同的而名字不同的文件不被包含,虽然这种情况比较少,但是还是有可能的。即两个文件虽然名字不同,但是内容完全相同,这时候,就通过#ifndef区别出来,保证这种情况不会被重复编译。

缺点如下:

1.比较麻烦...好大一串,而且,这个#ifndef ...后面的宏名字还需要自己定义,一般就是文件名的大写。

2.自己定义#ifndef后面的宏名字,虽然可以保证内容相同的文件不被重复包含,但是,如果两个文件的宏名字相同了,就有可能导致一个文件被包含了,另一个不被包含,进而导致明明声明了函数,却找不到的情况。



三.#pragma once

这个倒是灰常精简,就一句话。这种是由编译器提供编译的保证。只需要在头文件头添加这句话,就可以保证这个文件不被重复包含了。

//includetest头文件:

#pragma once
void TestFunc();

优点如下:

1.简单粗暴,一句搞定。而且不需要上面那种情况,需要绞尽脑汁的想一个尽可能长长的宏名字。

2.不用自己起宏名字,就可以避免上面那种可能有宏名字冲突的情况。

缺点如下:

1.这个是微软发明的东东,所以不是普适性的。有些老的编译器还不支持这条特性,虽然现在这条已经基本被各种编译器支持了,不过,保险的话,跨平台的还是用上一种。

2.不能保证内容相同但名字不同的文件被重复包含。


其实,这两者的优缺点是互补的,我们可以视情况而定,到底用哪一种。最好是使用同一种。本人以前还干过两个一起用的蠢事....


ubuntu系统禁止/开启内核自动更新 内核自动更新会导致驱动和内核版本不对应,导致驱动无法使用,所以需要禁止自动更新内核。本文介绍ubuntu系统禁止/开启内核更新的方法。 阅读详情

相关推荐

MaxEnt物种分布预测中的常见误区与优化技巧:如何提高模型准确率

本文深入探讨了MaxEnt物种分布预测模型从基础应用到精准预测的进阶实践。针对模型准确率提升,文章系统分析了环境变量筛选、模型参数调优、结果批判性解读等核心环节的常见误区,并提供了基于生态位模型原理的深度优化技巧,帮助研究者产出更可靠、可解释的预测结果。

weixin_29219539的博客 594

#pragma once 与 #ifdef

解析#pragma指令 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。 其格式一般为: #Pragma Para 其中Pa

1946

Halcon与C#联合编程(一):使用S7协议实现机器视觉上位机与西门子PLC联动

本项目技术栈:C#基础,多线程,Halcon DirectShow,Halcon形状检测,Halcon QR码识别,西门子S7通讯协议,西门子PLC为核心的下位机及执行元件

虎鲸不是鱼 1万+

C++ #pragma once和 #ifndef/#define/#endif区别

1.#pragma once这个宏有什么作用? 为了避免同一个头文件被包含(include)多次,C/C++中有两种宏实现方式:一种是#ifndef方式;另一种是#pragma once方式。 在能够支持这两种方式的编译器上,二者并没有太大的区别。但两者仍然有一些细微的区别。 2.两者的使用方式有何区别? 示例代码如下: 方式一: #ifndef__SOMEFILE_H__ #define __SOMEFILE_H__ ... ... // 声明、定义语句 #endif ...

qq_21909049的博客 614

串口接收完整一帧数据包的3种方法

本文介绍3种使用串口接受一帧完整数据包的方法,串口接收数据是字节接收的,串口每接收1字节数据,产生一个串口中断,我们在中断中将接收到的数据存放到buf中进行保存,但是数据的发送和接收都是按照帧为单位进行传输的,因此我们要在接收数据的同时判断当前接收的数据是否是完整的一帧。 一般串口完整数据帧的定义:帧头(2字节,例如AA、BB) + 数据长度(2字节) + 数据+ CRC16校验(2字节) + 帧尾(2字节) 帧头、帧尾表示一帧数据的开始和结尾,数据长度表示当前数据帧中负载数据大小,CRC16校...

爱吃鱼的猫 6万+

用 SE84 反查 SAP 消息号:弹窗一闪而过也能抓到 Message ID 和 Number 的小技巧

SAP开发技巧:通过消息文本反查Message ID和编号 在SAP开发中,经常遇到系统只显示错误消息文本而缺少技术信息的情况。本文介绍两种实用方法: 使用SE84工具:通过输入带通配符的短文本(如"错误文本")反向查找消息类和编号 直接查询T100表:利用消息文本在T100表中检索完整的消息技术信息 这些技巧特别适用于处理弹窗消息、框架层错误等无法直接获取技术细节的场景。掌握消息ID和编号后,开发者可以更高效地进行问题定位、代码调试和错误处理,尤其在SAP Gateway、RAP等现代

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 370

pragma once用法总结

pragma指令与#ifndef指令 在C/C++中,在使用预编译指令#include的时候,为了防止重复引用造成二义性,通常有两种方式—— 第一种是#ifndef指令防止代码块重复引用,比如说 #ifndef _CODE_BLOCK #define _CODE_BLOCK // code #endif// _CODE_BLOCK 第二种就是#pragma once指令,在想要保护的文件开头写入 #pragma once #ifndef方式是C/C++语言的标准支持,也是比较常用的方式,#if

DaMercy的博客 8744

超声波雷达探测车位及信号处理方法

在APA泊车中用到了超声波雷达,第一次接触,总结研究之。

周陽讀書 1229

#pragma once用法总结,及与 #ifndef方式的区别

#pragma once用法总结,及与 #ifndef方式的区别

ken2232的博客 392

FlexSim:FlexSim软件介绍与安装

在开始安装FlexSim之前,首先需要从FlexSim官方网站下载安装包。FlexSim提供不同版本的软件,包括教育版、专业版等,确保选择适合您需求的版本。下载页面通常会列出系统要求,包括操作系统、处理器、内存和硬盘空间,确保您的计算机满足这些要求。访问FlexSim官方网站。导航至下载页面。选择适合您需求的FlexSim版本。点击下载按钮,开始下载安装包。在开始构建模型之前,首先需要明确模型的目标。模型目标是指导模型设计和分析的核心,它定义了你希望通过模型解决的问题或探索的系统行为。

kkchenjj的博客 5802

基于Simulink的PID控制汽车巡航控制系统建模与仿真

汽车巡航控制系统(Cruise Control System)是一种通过自动调节发动机输出功率来维持车辆以恒定速度行驶的技术。这种系统能够减轻驾驶员在长途驾驶中的疲劳,同时提高燃油经济性和行车安全性。PID(比例-积分-微分)控制器因其结构简单、性能稳定且易于实现而被广泛应用于汽车巡航控制系统中。本项目旨在通过MATLAB/Simulink平台设计和验证一个基于PID控制的汽车巡航控制系统,重点研究PID参数调优方法、系统动态响应特性以及稳态误差消除能力。

MHD0815的博客 196

# pragma once 作用和#ifndef的比较

# pragma once 作用和#ifndef的比较

weixin_42326417的博客 824

在 SAP S/4HANA Public Cloud 中,用 RAP 一键生成 PDF 并在 Fiori 前端触发下载的完整方案

create;update;delete;// 生成并返回当前文档上下文。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 408

#ifndef #define #endif (条件编译) 和#pragma once

#ifndef #define #endif 作用 防止重复引用(重复引用会导致编译效率低) 有可能 还会报错

weixin_40026739的博客 2591

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

条件编译之——#define,#ifndef #define #endif ,#pragma once,#if defined

预定义符号 #define 例1: #define MAX_SIZE 20 #define 用于替换文本代码 #define MAXSIZE 20 void main() { char str[MAXSIZE]; } 编译器在处理这个代码之前会对MAXSIZE进行处理,替换为20。 例2: 替换参数 #define DOUBLE(x) ((x)+(x)) #define DOUBLE(x) (...

BShanj的博客 565

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

#ifndef……#define……#endif与#pragma once

      这两套宏是用于C++头文件中防止头文件重复包含的,使用方法如下:1、#ifndef……#define……#endif#ifndef __ABOUTWNDUI_H__#define __ABOUTWNDUI_H__// Todo// code// ......#endif /* __ABOUTWNDUI_H__ */  2、#pragma on

magictong的专栏 2282

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

关于 #pragma once vs #ifndef #define #endif

论头文件保护

威桑的博客 1012

#pragma once 和 #ifndef,#define,#endif

1.#pragma once是编译器相关的,就是说即使这个编译系统上有效,但在其他编译系统也不一定可以,不过现在基本上已经是每个编译器都有这个杂注了。     #ifndef,#define,#endif是C/C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式        2. 简单说明:

linuxlinuxlinuxlinux的专栏 1036

#define #ifndef #endif 和 #pragma once(含代码示例)

C/C++ 中的宏定义

m0_51913750的博客 583

#pragma once与#ifndef #define #endif的异同

1、#pragma once和起到和#ifndef #define #endif的相同点 他们都可以做到防止头文件的内容被重复包含的作用 2、#pragma once和起到和#ifndef #define #endif的不同点 #ifndef #define #endif受C/C++标准的支持,不受编译器的任何限制 较老的编译器不支持#pragma once,如gcc 3.4,兼容性不够好 #ifndef #define #endif可以针对一个文件的部分代码,而#pragma once只.

哎哟哟也爱技术 268

#pragma once与#ifndef #define #endif的区别

1.       #pragma once用来防止某个头文件被多次include;      #ifndef,#define,#endif用来防止某个宏被多次定义。   2.        #pragma once是编译相关,就是说这个编译系统上能用,但在其他编译系统不一定可以,也就是说移植性差,不过现在基本上已经是每个编译器都有这个定义了;   #ifndef,#define,#en

yangle4695的博客 446

#pragma once和#ifndef / #define / #endif的区别

<br />                                转摘自: http://www.360doc.com/content/10/0124/00/722458_14261695.shtml<br /> <br />#pragma once 指令<br />格式如下:<br />#pragma once<br />这是一个比较常用的指令,只要在头文件的最开始加入这条指令就能够保证头文件只被被编译一次。<br />(1)#pragma once是编译相关的,就是说这个编译系统上能用,但在其

FoxBryant的专栏 1371

#pragma once与#ifndef #define ...#endif的区别

1.       #pragma once用来防止某个头文件被多次include;      #ifndef,#define,#endif用来防止某个宏被多次定义。   2.        #pragma once是编译相关,就是说这个编译系统上能用,但在其他编译系统不一定可以,也就是说移植性差,不过现在基本上已经是每个编译器都有这个定义了;  

ARRAYLI_博客 652

#ifndef #define #endif 和#pragma once的区别

相同点:#ifndef #define #endif和 #pragma once 都是用来保证一个.h文件只被编译一次。 不同点: 1. #ifndef #define #endif 用来防止一个宏被重复定义多次; #pragma once可以防止一个.h文件被一个.cpp重复include。嵌套包含时这种情况很常见,比如说.cpp中include .1h和.2h,而在.1h中又包含...

weixin_30393907的博客 334

#ifndef #define #endif 是什么意思? 与 #pragma once有啥区别?

头文件中经常会看到#ifndef    #define   #endif  它是啥意思,又有啥用呢?它是为了防止该头文件被重复引用。比如在m.h引用了n.h,在k.h中引用了m.h,n.h   那就会造成重复引用的问题。使用格式     #ifndef    M_H               对应的含义     如果不存在 M_H                  #define   M_H  ...

weixin_38114913的博客 1670

【转载】#pragma once与#ifndef #define #endif的区别

一、相同点 两者的共同点都是为了避免同一个文件被 include 多次,但是 #ifndef #define #endif 不只有这个作用。在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。二、收集理解1.#pragma once 这个是编译器相关,就是说在这个编译系统上能用,在...

weixin_34257076的博客 95
上一篇: C++那些细节--函数的默认参数
下一篇: Lua学习笔记--基本语法规则&控制流语句
puppet_master
puppet_master 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄12年 2695粉丝 161原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值