- 浏览: 444051 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (158)
- J2SE (15)
- c/c++ (17)
- linux & ubuntu (20)
- js (18)
- algorithm (21)
- android (1)
- software (3)
- svn (1)
- db (6)
- other (19)
- css (5)
- go (1)
- html 5 (3)
- computer science (1)
- php (3)
- 创业 (8)
- EJB & jboss (1)
- TDD (1)
- jsp & servlet (2)
- http, tcp & ip (2)
- hibernate (1)
- json (1)
- 乐 (2)
- ps (2)
- netbeans (1)
- extjs (2)
- eclipse (4)
- 项目管理 (1)
- varnish (2)
- study abroad (1)
- python (1)
- erlang (1)
- math (1)
- shell (1)
- assembly (4)
- lucene (1)
- web (1)
- http (1)
- tcp & ip (1)
最新评论
-
yiguxianyun:
...
css li 不换行 -
stdayong:
...
netbeans 中使用 maven -
程序猿_星:
为啥会中文乱码啊
servlet 以 gzip 格式返回数据 -
huanhuan519:
感谢分享~
gdb 调试工具 -
heyl1234:
写过些js,对css还不熟。谢谢~
css li 不换行
c #define
macro substitution, define alias name for something, include:
#define
#undef
#ifdef / #ifndef / #endif
------
#define
define an alias name for value / expression / .. ,
format:
#define name replacement_text
how it work:
before compile, the name will be replace by the replacement_text,
name:
name could be anything, by conversion, name for value use uppercase, for function use lowercase,
replacement_text:
could be anything,
function define:
if name is a function(..), then you can pass param to it,
in pre-compile stage, the param is replaced with the variable name you pass,
the param of function has no specific type, you can pass any type as long as the program is correct,
evaluate twice:
the param will be envalued twice, so don't pass param that has side effect, e.g. i++,
order of evaluate:
the param is replaced literally, so use parentheses to make sure correct evaluate order,
e.g.
#define square(x) x * x /* wrong */
#define square(x) (x) * (x) /* ok */
call square(i+1)
#:
when #define a function, in the expression, when put # before param, the param will be evaluated and put into "",
e.g.
#define connect_num_to_str(a,b) #a #b /* connect numbers */
char *s = connect_num_to_str(100,200);
printf("%s\n", s); /* "100200" */
##:
when #define a function, in the expression, when put ## before param,
the parameter is replaced by the actual argument name, the ## and surrounding white space are removed, and then the result is rescanned,
this is a way to create a specify variable name,
## can't appear at start or end of the expression,
e.g.
#define another_var_by_prefix(pre,suf) pre ##suf /* specify a variable name by connect string */ // first s ##2, then s2, so s3 = s2 char *s3 = another_var_by_prefix(s,2);
------
#undef
format:
#undef NAME
usually, this is used to make sure a function_name is not a macro,
------
#ifdef / #ifndef / #endif
check whether a macro is defined, and execute statements,
format:
#ifdef / #ifndef NAME
...
#endif
similar to:
#if defined(name)
#if !defined(name)
multiple define:
you can define a NAME more than once,
if you define a NAME more than once with different value, it's ok, but you might get a warning when compile,
------
defined(name)
used with #if, to detecact whether a macro is defined,
format:
#if defined(name) / #if !defined(name)
#if defined name / #if !defined name
------
code
define_test.c:
#include <stdio.h> #define MY_NAME "eric" #define square(x) (x) * (x) #define multiply(a,b) (a) * (b) #define multiply_wrong(a,b) a * b /* this is wrong, the order has problem */ #define connect_num_to_str(a,b) #a #b /* connect numbers */ #define another_var_by_prefix(pre,suf) pre ##suf /* specify a variable name by connect string */ #define swap(t,x,y) {t _z = x; x = y; y=_z;} /* exchange value of x and y, t should be a type, can use typeof() to get a type, */ #ifdef MY_AGE #undef MY_AGE /* undefine a macro name */ #endif #ifndef MY_AGE #define MY_AGE 25 /* define a micro name, if not defined yet */ #endif main() { printf("%s,%d\n",MY_NAME,MY_AGE); printf("%d\n",square(MY_AGE+1)); printf("%d\n",multiply(MY_AGE+1,MY_AGE-1)); printf("%d\n",multiply_wrong(MY_AGE+1,MY_AGE-1)); char *s = connect_num_to_str(100,200); printf("%s\n", s); char *s2 = "a" "b"; printf("%s\n", s2); char *s3 = another_var_by_prefix(s,2); printf("%s\n", s3); int x = 10, y=20; swap(typeof(x),x,y); printf("%d,%d\n",x,y); }
------
发表评论
-
c - linkedlist
2012-05-10 14:52 1093c - linkedlist store ordere ... -
c - word counter (binary-tree)
2012-05-09 14:17 1731c - word counter (binary-tree) ... -
c - pointer is also pass by value
2012-05-09 14:13 973c - pointer is also pass by ... -
find palindromic-prime in pi
2012-04-26 18:32 1857find palindromic-prime in pi ... -
c static
2012-04-04 21:59 1243c static static external ... -
c extern
2012-04-04 21:53 1160c extern extern, used to de ... -
int to string by specified base
2012-04-03 22:15 1087int to string by specified base ... -
random select
2011-08-28 01:00 1211random select problem: ... -
sparse data structure - matrix
2011-08-18 20:03 1090sparse data structure sp ... -
max sub_sequence - c
2011-08-10 01:02 1080max sub_sequence - c /* ... -
binary search - c
2011-08-06 12:07 1098binary search - c (simple) ... -
bit_array - simple use
2011-05-28 23:47 1010bit array,use less memory to de ... -
linux c udp
2011-04-01 18:02 2100linux 下可用 c 进行 udp 通信,使用 server ... -
linux c tcp
2011-04-01 18:00 3066linux 下可用 c 进行 tcp 通信,使用 server ... -
gdb 调试工具
2011-02-21 17:20 3324gdb 调试工具 gdb 概 ... -
eclipse3.5 + mingw 搭建c++ 开发环境
2010-09-28 08:22 2381eclipse3.5 + mingw 搭建c++ 开发环境 ...
相关推荐
### C语言 #define 用法集锦 #### 1. 简单的 `#define` 定义 `#define` 指令在C语言中被广泛用于定义符号常量,即所谓的宏定义。它允许程序员为特定的值或表达式赋予一个标识符,从而简化代码编写并提高可读性。 ...
在C语言编程中,`#define`是一个非常强大的预处理器指令,它被广泛用于定义宏、常量或简化的类型声明等。然而,`#define`的不当使用可能会引入一系列的问题和陷阱,本文将深入探讨这些陷阱及其解决方法。 #### 宏...
在C语言中,宏定义是使用预处理器指令#define实现的一种编译前文本替换机制。它在编译之前处理源代码,使得可以定义常量、实现内联函数以及防止头文件被重复包含等多种功能。下面详细说明标题和描述中提到的知识点。...
C/C++ 中 #ifndef 和 #define 的用法 #ifndef 和 #define 是 C 语言中的两个重要命令,它们在实际编程中扮演着重要角色。#ifndef 命令用来判断一个宏是否已经定义,而 #define 命令则用来定义一个宏。下面我们将...
在C/C++编程中,宏定义(#define)是一种预处理器指令,用于创建符号常量或简单的文本替换。宏在程序编译时起作用,它不是真正的函数,但可以通过模拟函数调用来实现类似的功能,从而提高代码的可读性和可维护性。在...
### #define 的使用及其特性 ...通过以上的详细介绍,我们可以看出 `#define` 和 `typedef` 在 C 或 C++ 中各自发挥着重要的作用,根据具体的应用场景选择合适的工具可以使程序变得更加高效、易读和易于维护。
#define 指令是 C 语言中的一种预处理指令,用于给常量赋予一个有意义的名称。在本文中,我们将详细介绍 #define 指令的用法、实例和注意事项。 定义 ---- #define 指令的基本语法有两种形式: ```c #define ...
```c #define XBYTE ((unsigned char volatile xdata *) 0) void main() { // 直接访问外部RAM XBYTE[0x2000] = 0xAA; // 写入数据 unsigned char data = XBYTE[0x2000]; // 读取数据 } ``` #### 注意事项 1. ...
总结而言,`#ifndef`, `#define`, `#endif` 是 C/C++ 编程中非常重要的预处理指令,它们不仅可以帮助我们有效地管理头文件的包含,还可以用于实现条件编译等功能,是提高程序质量和可维护性的有力工具。
在实践中,现代的C编译器如GCC和Clang已经集成了高效的预处理器,它们处理`#include`和`#define`以及其他预处理指令的能力远超我们的简单实现。然而,理解这些基本概念对于任何想要深入研究编译器原理的开发者来说都...
在C语言中,定义常量通常可以使用const修饰符和#define预处理命令两种方式。这两种方法虽然在很多情况下可以互换,但它们之间存在一些本质的区别,了解这些区别对于编写高效、可维护的代码至关重要。 首先,我们来...
在C/C++编程语言中,`#define` 是预处理器指令,用于创建宏定义,它在编译阶段执行文本替换,使得代码更加灵活且可定制化。宏定义是C/C++编程中的一个重要概念,它可以帮助程序员实现代码复用、简化复杂表达式、提供...
使用场合:拼接两个宏,一个是传入的宏。但是传入的宏不会被替换,...#define DEFINE(X) DEFINE_(X) //再次定义 #define PARAM DEFINE(OBJECT) void fun() { // DEFINE_(OBJECT)=100; 这个操作是拒绝的,它就是直接拼
总结来说,`#ifndef`、`#define` 和 `#endif` 在C语言编程中用于实现头文件保护,防止头文件被多次包含导致的错误。`#ifndef` 检查宏是否已定义,`#define` 定义宏,`#endif` 结束条件预处理器指令块。理解并正确...
在C及C++编程中,`#define`是一个非常强大的预处理器指令,用于创建宏。宏可以在编译前阶段替代代码片段,提高代码的复用性与可维护性。本文将详细探讨`#define`的各种使用场景及其背后的原理。 #### 二、基本结构 ...
### #ifndef 与 #define 的区别及用法详解 #### 一、概述 在C/C++编程中,预处理指令是非常重要的组成部分,它们在编译前由预处理器执行,能够帮助开发者实现代码重用、条件编译等功能。本文将重点讨论 `#ifndef` ...
在C/C++编程中,`#define`预处理器指令扮演着重要的角色,它可以用来定义常量、创建类似函数的功能以及实现条件编译等。下面我们将深入探讨`#define`的各种用法。 1. **简单的#define定义** `#define`常用于创建...
C语言中宏定义#define用法总结 在 C 语言中,宏定义(#define)是一种非常重要的预处理器指令,它可以让我们在编译前对代码进行修改和扩展。本文将对宏定义的用法进行总结,包括简单的宏定义、带参数的宏、宏的特殊...
在C++和C语言中,预处理器指令`#define`被广泛用于定义宏,这些宏可以包含简单的替换文本,也可以进行复杂的条件判断和参数处理。本文将详细介绍宏定义中的`#`和`##`符号的含义,并通过具体示例来说明它们的应用场景...