`
bliuqing
  • 浏览: 65107 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
最近访客 更多访客>>
社区版块
存档分类
最新评论

c预编译 #define相关

阅读更多
#是生成字符串:
          #define a(x) #x
          a(bc) => "bc"

##是连接:
          #define a(x) abc##x
          a(123) => abc123

#error是生成编译错误消息:

          #ifdef abc
                #error something wrong...
          #endif
    //如果abc是已经定义的宏,那么编译的时候就会显示错误消息something wrong...
//////////////////////////////////////////////////////////////////////
“标准”宏定义一个MIN 输入两参数输出其中最小的
#define MIN(A,B) ((A)<= (B) ? (A) : (B) )
这种定义会带来一些副作用,看下面的例子:

int x = 1, y = 2;
int main()
{
   printf("min=%d\n", min(x++, y++));
   printf("x = %d, y = %d\n", x, y);
}

执行完min(x++、y++),我们期望x的值为2,y的值为3。

但是,实际的结果是,执行完mini(x++、y++)后,x的值为3,y的值为3,原因在于宏展开后x++被执行了两次。但暂时没找到其它更好的办法。
分享到:
评论

相关推荐

    c++ 尽量不要使用#define 而是用const、enum、inline替换。

    例如:这里程序文件开头有如下#define语句 代码如下: #define N 10 #define PI 3.14 #define MAX 10000 #define Heigth 6.65 … … 假设这里程序运行出错误,而且就是在我们使用这些常量有...因为在预编译阶段,已经

    C中的预编译宏定义.pdf

    在将一个C源程序转换为可执行程序的过程中, 编译预处理是最初的步骤. 这一步骤是由预处理器(preprocessor)来完成的. 在源流程序被编译器处理之前, 预处理器首先对源程序中的"宏(macro)"进行处理. ... ...

    Obfuscation-Demo:演示如何从Swift代码中访问在运行时(使用编译时#define)对其名称进行混淆的Objective-C类和方法,并在源代码中使用易于理解的名称-How to use the source code

    演示如何从Swift代码访问在运行时(使用编译时#define )对其名称进行混淆的Objective-C类和方法,并在源代码中使用易于理解的名称。 Objective-C类和方法名称以二进制字符串形式存在于二进制文件中,并且在运行时...

    清除c/c++代码中条件编译部分的程序,帮助阅读源代码,生成好的tags

    网上众多的开源C/C++代码,因为跨平台的需要,参杂了许多的条件编译语句,对阅读源代码造成了不方便,而且用ctags等工具生成源代码的tags文件时会有些妨碍,本工具就是用来预处理这些条件编译的,将未定义的区域自动...

    跟我一起学C++

    const定义的常量在编译时分配内存,而#define定义的常量是在预编译时进行替换,不分配内存。 作用域不同,const定义的常变量的作用域为该变量的作用域范围。而#define定义的常量作用域为它的定义点到程序结束,当然...

    C语言预处理器

    C语言预处理器 C 预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。我们将把 C 预处理器(C ...

    万能头文件在C语言中的重要性及其主要格式.docx

    万能头文件 如果你是在特定场景(比如算法竞赛训练...防止重复包含:使用预处理器指令#ifndef、#define和#endif来确保头文件不会被重复包含。 C #ifndef UNIVERSAL_HEADER_H #define UNIVERSAL_HEADER_H // 这里包含

    浅谈c++ 预处理器

    预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理。 所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前。预处理指令不是 C++ 语句,所以它们不会以分号(;)结尾。 我们...

    memwatch.zip

    在vs项目中添加memwatch类, 项目属性 -&gt; c/c++ -&gt;预编译 -&gt; 与编译器定义 编辑添加 MEMWATCH DMW_STDIO 两个定义 2. 使用 Source.cpp #define _CRT_SECURE_NO_WARNINGS #include #include #include #...

    C/C++程序编译流程详解

    程序的基本流程如图: 1.预处理 预处理相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有...预编译程序将根据有关的文件,将那些不必要的代码过滤掉。 ③处理“#incl

    自己写的dll的简介

    但是这个关键字不能直接出现在头文件函数声明中,否则DLL无法通过编译, 原因很简单,C语言并没有extern "C"这个关键字。 1. 一种作法是把C向C++迁移的责任交给DLL创建者。定义出一个宏,以使DLL(C工程)中不出现...

    Linux下将源文件编译成目标文件的过程解析

    简介 请讲一下linux如何源文件逐步编译成可执行文件。 解答 ...主要是处理源文件中以“#”开头的预编译指令。 删除#define并展开宏 处理所有条件预编译指令,如#if, #ifdef, #endif 插入头文件到

    uboott移植实验手册及技术文档

    #mv smdk2410.c fs2410.c #vi Makefile (将 smdk2410修改为 fs2410) #cd ../../include/configs #cp smdk2410.h fs2410.h 退回 U-Boot根目录:#cd ../../ (4)建立编译选项 #vi Makefile smdk2410_config ...

    CC++电话面试

    电话面试的常见问题 1.简述数组与指针的区别? 2.什么是预编译,何时需要预编译? 3.关键字const是什么含义?const和#define相比,有何优点? 4 5

    深入理解C预处理器

    C 预处理器不是编译器的组成部分,是编译过程中一个单独的步骤。C预处理器只是一个文本替换工具,它会指示编译器在实际编译之前完成所需的预处理。 所有的预处理器命令都是以井号(#)开头。它必须是第一个非空字符...

    详解C语言中const关键字的用法

    那么它的值就不能再被改变,我想一定有人有这样的疑问,C语言中不是有#define吗,干嘛还要用const呢,我想事物的存在一定有它自己的道理,所以说const的存在一定有它的合理性,与预编译指令相比,const修饰符有以下...

    GNU libiconv-1.15和libintl-0.19.8.1,VS2017工程和 Makefile.mak 命令行编译文件

    GNU libiconv-1.15和libintl-0.19.8.1,VS2017工程和 Makefile.mak 命令行编译文件 CSDN-tags: libiconv1.15 libintl-0.19.8.1 VS2017 SDK17134.12 声明: 最新版,修正了relocatable.c文件中GetModuleFileName...

    c++ 操作xml , CMarkup库 的使用

    cmarkup是把整个xml文件作为字符串载入内存,再利用字符串类提供的函数进行访问,MFC环境下是利用CString,若不使用MFC,则需要增加编译预定义#define MARKUP_STL以使cmarkup 使用stl的string类  创建xml 第一步:...

    libiconv-1.15和libintl-0.19.8.1,VS2015工程和 nMakefile

    GNU libiconv-1.15和libintl-0.19.8.1,VS2015工程和 Makefile.mak 命令行编译文件 CSDN-tags: libiconv1.15 libintl 0.19.8.1 VS2015 Makefile 声明: 最新版,修正了relocatable.c文件中GetModuleFileName函数...

    RTKLIB-rtklib_2.4.3.zip

    1、 在vs中新建一个控制台项目(含预编译头); 2、 在建好的项目中添加rtklib.h以及需要用到的source文件(.c文件),然后将.c改为.cpp并在每个文件首句增加一行#include "stdafx.h",当然在stdafx.h文件中添加#...

Global site tag (gtag.js) - Google Analytics