热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++中的条件宏定义#ifdef,怎么用不起来?

我的问题是想实现这样的功能:#ifdefXXXTodo#endif但是这个XXX在什么地方定义呢?0、如果我直接定义的话,那么Todo程
我的问题是想实现这样的功能:

#ifdef XXX
   Todo...
#endif  


但是这个 XXX 在什么地方定义呢?
   0、如果我直接定义的话,那么 Todo 程序段肯定会被执行。
   1、我用了 
     #if (condition)
        #define XXX
     #endif
    怎么不起作用呢?就算我的 condition 成立,发现在程序中也不会执行“#define XXX”。
   请问,具体怎么实现这个功能?

30 个解决方案

#1


正在coding, 大神速度。。!

#2


#开头的命令是预编译命令,它的所有功能都在编译程序前完成
#if这个预编译命令,它的判断条件必须能够在编译程序前经由简单的文本处理和数学运算就得到结果,当然里面不能有任何程序编译后运行时才赋值的变量等

要在程序运行中做判断,请使用if语句

#3


windows还是linux平台?
vc的话,可以在预编译器选项里,linux可以在makefile里,-G

#4


XXX定义在#ifdef宏前面——本文件#ifdef位置之前或者#ifdef宏之前的头文件中

#5


#ifdef XXX
  Todo...
#endif   

但是这个 XXX 在什么地方定义呢?

放在上面的代码之前啊

就两种情况:要么执行,要么不执行,对应定义XXX和不定义XXX

#6


#if defined XXX,XXX位置通#ifdef

#7


本来就是要么用,要么不用,你到底是要闹那样哟

#8


  #if (condition)
  #define XXX
  #endif 我是放在前面啊,但是我的condition条件, 没有用啊。 不管我的 condition 是否成立,里面的#define XXX 始终没有被执行啊?也就是说,
#ifdef XXX
  Todo...
#endif  中的Todo 也没有被执行。

引用 5 楼  的回复:
#ifdef XXX
  Todo...
#endif  

但是这个 XXX 在什么地方定义呢?

放在上面的代码之前啊

就两种情况:要么执行,要么不执行,对应定义XXX和不定义XXX

#9


是VS(vc),但是我要是不用的话,还要到编译器里面把 它删了吧! 多麻烦?!
引用 3 楼  的回复:
windows还是linux平台?
vc的话,可以在预编译器选项里,linux可以在makefile里,-G

#10


 //#if (condition)
 if (condition)  
 {
  #define XXX
 } 
// #endif
在程序中用 if 的话,也是不管我的if中条件是否成立,我的XXX 始终都被定义了啊。。!
引用 2 楼  的回复:
#开头的命令是预编译命令,它的所有功能都在编译程序前完成
#if这个预编译命令,它的判断条件必须能够在编译程序前经由简单的文本处理和数学运算就得到结果,当然里面不能有任何程序编译后运行时才赋值的变量等

要在程序运行中做判断,请使用if语句

#11


引用 8 楼  的回复:
#if (condition)
  #define XXX
  #endif 我是放在前面啊,但是我的condition条件, 没有用啊。 不管我的 condition 是否成立,里面的#define XXX 始终没有被执行啊?也就是说,
#ifdef XXX
  Todo...
#endif 中的Todo 也没有被执行。


引用 5 楼 的回复:
#ifdef XXX
To……

#if (condition)换成#if defined(XXX),XXX在这条宏定义前定义(#define XXX)

#12


#ifndef xxx
#define xxx
//................
#endif
头文件必须要有的
#define xxx2
#ifdef  xxx2
//*********
#else
//*************
#endif
条件编译,暂时删除一段代码,跨平台,debug,等等。

#13


引用 9 楼  的回复:
是VS(vc),但是我要是不用的话,还要到编译器里面把 它删了吧! 多麻烦?!

引用 3 楼 的回复:
windows还是linux平台?
vc的话,可以在预编译器选项里,linux可以在makefile里,-G

vc的话,好像这个#if 条件 #endif不起作用 
Linux下才行 

#14



#define xxx2
#ifdef xxx2
//*********
    Todo1...
#else
//*************
    Todo2...
#endif

你这样写的话,是不是 Todo1 肯定被执行了,而Todo2 肯定不会被执行。 如果我要是想执行 Todo2的话,
岂不是还要到代码中删除 #define xxx2;
 我的问题是,根据某些条件去决定是否要 定义xxx2(#define xxx2)。而这些条件又不想2楼说的那样简单(“能够在编译程序前经由简单的文本处理和数学运算就得到结果”)。

引用 12 楼  的回复:
#ifndef xxx
#define xxx
//................
#endif
头文件必须要有的
#define xxx2
#ifdef xxx2
//*********
#else
//*************
#endif
条件编译,暂时删除一段代码,跨平台,debug,等等。

#15


回楼主:
    对于楼主这种写法!我见过他的使用!这种使用一般是这个头文件根据不同的条件对应不同的内容。例如你那个XXX可以是平台里自带的宏定义那么这种写法就可以实现对应不同平台的头文件包含方法。
对于楼主说XXX在哪里定义,这个真的不好回答!只有楼主提供了你的需求才好回答!

#16


引用 14 楼  的回复:
#define xxx2
#ifdef xxx2
//*********
  Todo1...
#else
//*************
  Todo2...
#endif

你这样写的话,是不是 Todo1 肯定被执行了,而Todo2 肯定不会被执行。 如果我要是想执行 Todo2的话,
岂不是还要到代码中删除 #define xxx2;
 我的问题是,根据某些条件去决定……

请问楼主的条件想写成什么样子的?需要很复杂吗?是一个什么样的功能需要很复杂的预编译选项?

#17


#开头的指令都是预处理指令,和 C 语句是不一样的。
C 的编译阶段分 预处理->编译->链接。
预处理主要用处就是在源代码里做文字替换和筛选工作,为编译做准备。
#if...#endif 就是告诉预处理器如果 #if 后面的条件成立,那么就把 #if 和 #endif 这两行(不包括这两行里面的内容)删了交给编译器;如果不成立,那么把 #if...#endif 之间的所有内容删了交给编译器。
编译器看不到任何 #打头的命令,因为预处理器都给处理掉了,而且编译器即使看到了也只会报错,因为它不认识这些指令。

#18


//好吧,主要程序是这样的:
#define MAC_Equal(dest, sour) dest=sour
#define MAC1(a,b,step,param,d)   for(param = a; param < b; param+=step) \
                                             {  \
                                                 MAC_Equal(d, param);
 #define MAC2 }

#include 
using namespace std;
int main()
{
 int a = 1;
int b = 10;
int step = 1;
int param = 0;
int d = 100;

 //#ifdef XXX  
   MAC1(a,b,step,param,d)
//#endif
     cout<
 //#ifdef XXX 
   MAC2 
//#endif

return 1;
}

//就是想知道在哪可以控制我的 XXX定义, 来控制我的程序是执行循环,还不执行循环。
//手敲的代码,可能会有误!!

#19


引用 14 楼  的回复:
 我的问题是,根据某些条件去决定是否要 定义xxx2(#define xxx2)。而这些条件又不想2楼说的那样简单(“能够在编译程序前经由简单的文本处理和数学运算就得到结果”)。

写if(){}else{}很痛苦?
非要把预编译命令难以完成甚至无法完成的功能交给它很幸福?

判断#if是否能够使用很简单,那就是它的判断条件是否会在运行时被修改
如果它的判断条件在程序编译前就已经确定了,那就可以使用,具体怎么用可以再商量,当然也没准编译器不支持太复杂的用法
如果它的判断条件需要在程序运行时计算出结果,那彻底没戏。预编译预编译,顾名思义,在编译前就被确定的东西,不可能在程序运行时有任何改变
这是原则性问题,这是原理性问题,想推翻这一条,请自己发明一门新语言和一套新编译器

所以问题很简单
你所谓的“根据某些条件去决定”的这些条件,是否在程序编译前就已经确定结果?

顺便,#define MAC1(a,b,step,param,d)这种写法烂透了
#define就是简单的文本替换,写函数要安全得多

#20


    我这里主要是想要重用代码,之所以用#define MAC_Equal(dest, sour) dest=sour
是因为我这里 有将近70多个变量 ,既要能执行单个值运算,又要能实现 for 循环啊(选取在哪个值时,结果最优)。
而且这些变量哪个要 执行for循环,还要根据用户选择。
  我怎么能用 if(...)else(...)来搞搞定

#21


我这里主要是想要重用代码,之所以用#define MAC_Equal(dest, sour) dest=sour
是因为我这里 有将近70多个变量 ,既要能执行单个值运算,又要能实现 for 循环啊(选取在哪个值时,结果最优)。
而且这些变量哪个要 执行for循环,还要根据用户选择。
  我怎么能用 if(...)else(...)来搞搞定

引用 19 楼  的回复:
引用 14 楼 的回复:
我的问题是,根据某些条件去决定是否要 定义xxx2(#define xxx2)。而这些条件又不想2楼说的那样简单(“能够在编译程序前经由简单的文本处理和数学运算就得到结果”)。

写if(){}else{}很痛苦?
非要把预编译命令难以完成甚至无法完成的功能交给它很幸福?

判断#if是否能够使用很简单,那就是它的判断条件是否会在运行时被修改
如果它的判断条……

#22


楼主清楚
#if是在编译期
if是在运行时
吗?

#23


引用 20 楼  的回复:
    我这里主要是想要重用代码,之所以用#define MAC_Equal(dest, sour) dest=sour
是因为我这里 有将近70多个变量 ,既要能执行单个值运算,又要能实现 for 循环啊(选取在哪个值时,结果最优)。
而且这些变量哪个要 执行for循环,还要根据用户选择。
  我怎么能用 if(...)else(...)来搞搞定

不想多说什么了,只问一句,不能用ifelse搞定的东西就想用#if#else搞定?依据什么?

既然要根据用户在程序运行时的选择来决定执行什么代码,那预编译命令对于这个目的就没有任何用处,别想着什么重用代码之类的优化了,先把基本功能实现再说别的吧

#24




我换成if(){}else{}l了;
单有出现问题了,


int main()
{
 int a = 1;
int b = 10;
int step = 1;
int param = 0;
int d = 100;
bool flag = false;
 if(flag)
  MAC1(a,b,step,param,d)

  cout<
 if(flag); //这里居然要 加";"才能编译过去。。
  MAC2  
 

return 1;
}






引用 23 楼  的回复:
引用 20 楼  的回复:

我这里主要是想要重用代码,之所以用#define MAC_Equal(dest, sour) dest=sour
是因为我这里 有将近70多个变量 ,既要能执行单个值运算,又要能实现 for 循环啊(选取在哪个值时,结果最优)。
而且这些变量哪个要 执行for循环,还要根据用户选择。
我怎么能用 if(...)else(...)来搞搞定

不想多说什么……

#25



明白了。。。!
引用 22 楼  的回复:
楼主清楚
#if是在编译期
if是在运行时
吗?

#26


int main()
{
 int a = 1;
int b = 10;
int step = 1;
int param = 0;
int d = 100;
bool flag = false;
 if(flag)
  MAC1(a,b,step,param,d)

  cout<
 if(flag); //这里居然要 加";"才能编译过去。。
  MAC2  
 

return 1;
}

这段代码在编译前进行宏替换,成为以下这段代码

int main()
{
 int a = 1;
int b = 10;
int step = 1;
int param = 0;
int d = 100;
bool flag = false;
 if(flag)
  for(param = a; param < b; param+=step) 
  { 
  d = param;

  cout<
 if(flag); //这里居然要 加";"才能编译过去。。
  }
 

return 1;
}

现在看明白了没?

#27


好的,明白了。 Thanks...!
但我的问题还没有解决。在一段代码中 既要实现循环,又要可以单值计算。

不过有if()else() 还是可以解决的,虽然多了点代码。
int main()
{
 int a = 1;
int b = 10;
int step = 1;
int param = 0;
int d = 100;
bool flag = false;
 if(flag){
  MAC1(a,b,step,param,d)
  cout<
 //if(flag); //这里居然要 加";"才能编译过去。。
  //MAC2   
 }
}else
{
cout<
}

return 1;
}




引用 26 楼  的回复:
int main()
{
 int a = 1;
int b = 10;
int step = 1;
int param = 0;
int d = 100;
bool flag = false;
 if(flag)
  MAC1(a,b,step,param,d)

  cout<
 ……

#28


正如大神所料啊,,,!!!
预编译在我这个问题上,毫无用处啊。。。
引用 23 楼  的回复:
引用 20 楼  的回复:

我这里主要是想要重用代码,之所以用#define MAC_Equal(dest, sour) dest=sour
是因为我这里 有将近70多个变量 ,既要能执行单个值运算,又要能实现 for 循环啊(选取在哪个值时,结果最优)。
而且这些变量哪个要 执行for循环,还要根据用户选择。
我怎么能用 if(...)else(...)来搞搞定

不想多说什么……

#29


人气啊~~~顶之

#30


看开源代码

推荐阅读
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • 本文首先对信息漏洞的基础知识进行了概述,重点介绍了几种常见的信息泄露途径。具体包括目录遍历、PHPINFO信息泄露以及备份文件的不当下载。其中,备份文件下载涉及网站源代码、`.bak`文件、Vim缓存文件和`DS_Store`文件等。目录遍历漏洞的详细分析为后续深入研究奠定了基础。 ... [详细]
  • 从无到有,构建个人专属的操作系统解决方案
    操作系统(OS)被誉为程序员的三大浪漫之一,常被比喻为计算机的灵魂、大脑、内核和基石,其重要性不言而喻。本文将详细介绍如何从零开始构建个人专属的操作系统解决方案,涵盖从需求分析到系统设计、开发与测试的全过程,帮助读者深入理解操作系统的本质与实现方法。 ... [详细]
  • 本题库精选了Java核心知识点的练习题,旨在帮助学习者巩固和检验对Java理论基础的掌握。其中,选择题部分涵盖了访问控制权限等关键概念,例如,Java语言中仅允许子类或同一包内的类访问的访问权限为protected。此外,题库还包括其他重要知识点,如异常处理、多线程、集合框架等,全面覆盖Java编程的核心内容。 ... [详细]
  • 如何将PHP文件上传至服务器及正确配置服务器地址 ... [详细]
  • 进程(Process)是指计算机中程序对特定数据集的一次运行活动,是系统资源分配与调度的核心单元,构成了操作系统架构的基础。在早期以进程为中心的计算机体系结构中,进程被视为程序的执行实例,其状态和控制信息通过任务描述符(task_struct)进行管理和维护。本文将深入探讨进程的概念及其关键数据结构task_struct,解析其在操作系统中的作用和实现机制。 ... [详细]
  • Linux磁盘管理入门指南:MBR分区格式详解与安装步骤
    在 CentOS 7.x 环境下,本文详细介绍了 MBR 分区格式的基本概念及其安装步骤。实验中使用了 SAS 和 SATA 硬盘,其中 SAS 硬盘主要用于企业级应用和服务器,而 SATA 硬盘则广泛应用于个人计算机和低端服务器。文章通过具体操作示例,帮助读者更好地理解和掌握 Linux 磁盘管理的基本技能。 ... [详细]
  • Linux下Google Test (GTest)测试环境搭建步骤
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • 本文深入探讨了romfs与rootfs在概念上的区别及其应用场景。romfs通常作为只读文件系统存储在Flash的特定分区中,其起始地址为0x46000000。相比之下,rootfs是系统的根文件系统,负责管理和加载操作系统的核心组件及应用程序。两者在功能和使用场景上存在显著差异,romfs主要用于存储固件和配置文件,而rootfs则涵盖了更广泛的操作系统资源。 ... [详细]
  • 简书: https:www.jianshu.comp5c3938ce2cf61.官网下载https:nginx.orgendownload.html  2.上传CentOS服务略3 ... [详细]
  • ubuntu下基于c++的opencv学习
    一、环境配置1、安装opencv2、makefile编写makefile模板,与c文件在同一个目录下,用make指令生成可执行文件,然后运 ... [详细]
author-avatar
王静芸平桂
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有