#是生成字符串:
#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++被执行了两次。但暂时没找到其它更好的办法。
#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++被执行了两次。但暂时没找到其它更好的办法。
发表评论
-
gcc gdb常用命令
2010-10-06 11:20 1083gdb 链接: http://fanqiang.chinau ... -
指针数组,数组指针
2010-10-02 14:40 691void test(char* a[]) { ... -
如何用栈实现递归与非递归的转换
2010-04-10 15:18 918http://bbs.chinaunix.net/viewth ... -
华为笔试2
2009-06-16 09:37 957【转】http://hi.baidu.com/xiao1dia ... -
华为笔试1
2009-06-16 09:35 997【转】http://hi.baidu.com/xi ... -
用两个栈实现一个队列的功能
2009-06-03 15:22 2552【转】http://hi.baidu.com/liangjw8 ... -
嵌入式程序员应该知道的16个问题
2009-05-29 15:41 1021【转】http://blog.csdn.net/s ... -
嵌入式程序员应该知道的16个问题
2009-05-29 15:39 1477【转】http://blog.csdn.net/seraphs ... -
嵌入式程序员应该知道的16个问题
2009-05-29 15:38 853【转】http://blog.csdn.net/s ... -
嵌入式程序员应该知道的16个问题
2009-05-29 15:37 856【转】http://blog.csdn.net/s ... -
排序算法和二分查找
2009-05-17 15:50 783using namespace std; #includ ... -
C移位
2009-05-15 09:56 1337【转】 C提供了六种位运算运算符;这些运算符可能只允许整型操作 ... -
sizeof union struct 内存对齐
2009-05-14 20:30 2520【转】http://www.programfan.com/bl ... -
求100的阶乘
2009-05-06 16:32 1504#include <stdio.h> int m ... -
字符串操作
2009-05-03 15:19 795#include "stdafx.h" ... -
C字符串反转
2009-05-03 10:53 1753更改下面程序 #include string.h ... -
C链表相关
2009-05-03 10:38 765#include "stdafx.h" ... -
C题库连接
2009-04-29 09:28 740http://blog.chinaunix.net/u2/64 ...
相关推荐
例如:这里程序文件开头有如下#define语句 代码如下: #define N 10 #define PI 3.14 #define MAX 10000 #define Heigth 6.65 … … 假设这里程序运行出错误,而且就是在我们使用这些常量有...因为在预编译阶段,已经
在将一个C源程序转换为可执行程序的过程中, 编译预处理是最初的步骤. 这一步骤是由预处理器(preprocessor)来完成的. 在源流程序被编译器处理之前, 预处理器首先对源程序中的"宏(macro)"进行处理. ... ...
演示如何从Swift代码访问在运行时(使用编译时#define )对其名称进行混淆的Objective-C类和方法,并在源代码中使用易于理解的名称。 Objective-C类和方法名称以二进制字符串形式存在于二进制文件中,并且在运行时...
网上众多的开源C/C++代码,因为跨平台的需要,参杂了许多的条件编译语句,对阅读源代码造成了不方便,而且用ctags等工具生成源代码的tags文件时会有些妨碍,本工具就是用来预处理这些条件编译的,将未定义的区域自动...
const定义的常量在编译时分配内存,而#define定义的常量是在预编译时进行替换,不分配内存。 作用域不同,const定义的常变量的作用域为该变量的作用域范围。而#define定义的常量作用域为它的定义点到程序结束,当然...
C语言预处理器 C 预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。我们将把 C 预处理器(C ...
万能头文件 如果你是在特定场景(比如算法竞赛训练...防止重复包含:使用预处理器指令#ifndef、#define和#endif来确保头文件不会被重复包含。 C #ifndef UNIVERSAL_HEADER_H #define UNIVERSAL_HEADER_H // 这里包含
预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理。 所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前。预处理指令不是 C++ 语句,所以它们不会以分号(;)结尾。 我们...
在vs项目中添加memwatch类, 项目属性 -> c/c++ ->预编译 -> 与编译器定义 编辑添加 MEMWATCH DMW_STDIO 两个定义 2. 使用 Source.cpp #define _CRT_SECURE_NO_WARNINGS #include #include #include #...
程序的基本流程如图: 1.预处理 预处理相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有...预编译程序将根据有关的文件,将那些不必要的代码过滤掉。 ③处理“#incl
但是这个关键字不能直接出现在头文件函数声明中,否则DLL无法通过编译, 原因很简单,C语言并没有extern "C"这个关键字。 1. 一种作法是把C向C++迁移的责任交给DLL创建者。定义出一个宏,以使DLL(C工程)中不出现...
简介 请讲一下linux如何源文件逐步编译成可执行文件。 解答 ...主要是处理源文件中以“#”开头的预编译指令。 删除#define并展开宏 处理所有条件预编译指令,如#if, #ifdef, #endif 插入头文件到
#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 ...
电话面试的常见问题 1.简述数组与指针的区别? 2.什么是预编译,何时需要预编译? 3.关键字const是什么含义?const和#define相比,有何优点? 4 5
C 预处理器不是编译器的组成部分,是编译过程中一个单独的步骤。C预处理器只是一个文本替换工具,它会指示编译器在实际编译之前完成所需的预处理。 所有的预处理器命令都是以井号(#)开头。它必须是第一个非空字符...
那么它的值就不能再被改变,我想一定有人有这样的疑问,C语言中不是有#define吗,干嘛还要用const呢,我想事物的存在一定有它自己的道理,所以说const的存在一定有它的合理性,与预编译指令相比,const修饰符有以下...
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...
cmarkup是把整个xml文件作为字符串载入内存,再利用字符串类提供的函数进行访问,MFC环境下是利用CString,若不使用MFC,则需要增加编译预定义#define MARKUP_STL以使cmarkup 使用stl的string类 创建xml 第一步:...
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函数...
1、 在vs中新建一个控制台项目(含预编译头); 2、 在建好的项目中添加rtklib.h以及需要用到的source文件(.c文件),然后将.c改为.cpp并在每个文件首句增加一行#include "stdafx.h",当然在stdafx.h文件中添加#...