`

c #define

 
阅读更多

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语言 #define用法集锦[修正版]

    ### C语言 #define 用法集锦 #### 1. 简单的 `#define` 定义 `#define` 指令在C语言中被广泛用于定义符号常量,即所谓的宏定义。它允许程序员为特定的值或表达式赋予一个标识符,从而简化代码编写并提高可读性。 ...

    #define 问题 用法陷阱

    在C语言编程中,`#define`是一个非常强大的预处理器指令,它被广泛用于定义宏、常量或简化的类型声明等。然而,`#define`的不当使用可能会引入一系列的问题和陷阱,本文将深入探讨这些陷阱及其解决方法。 #### 宏...

    #define的使用技巧

    在C语言中,宏定义是使用预处理器指令#define实现的一种编译前文本替换机制。它在编译之前处理源代码,使得可以定义常量、实现内联函数以及防止头文件被重复包含等多种功能。下面详细说明标题和描述中提到的知识点。...

    【C/C++】#ifndef,#define用法

    C/C++ 中 #ifndef 和 #define 的用法 #ifndef 和 #define 是 C 语言中的两个重要命令,它们在实际编程中扮演着重要角色。#ifndef 命令用来判断一个宏是否已经定义,而 #define 命令则用来定义一个宏。下面我们将...

    宏(#define)定义函数妙用

    在C/C++编程中,宏定义(#define)是一种预处理器指令,用于创建符号常量或简单的文本替换。宏在程序编译时起作用,它不是真正的函数,但可以通过模拟函数调用来实现类似的功能,从而提高代码的可读性和可维护性。在...

    #define和typedef的使用

    ### #define 的使用及其特性 ...通过以上的详细介绍,我们可以看出 `#define` 和 `typedef` 在 C 或 C++ 中各自发挥着重要的作用,根据具体的应用场景选择合适的工具可以使程序变得更加高效、易读和易于维护。

    #define——用法大全

    #define 指令是 C 语言中的一种预处理指令,用于给常量赋予一个有意义的名称。在本文中,我们将详细介绍 #define 指令的用法、实例和注意事项。 定义 ---- #define 指令的基本语法有两种形式: ```c #define ...

    单片机-#define XBYTE ((unsigned char volatile xdata *) 0)

    ```c #define XBYTE ((unsigned char volatile xdata *) 0) void main() { // 直接访问外部RAM XBYTE[0x2000] = 0xAA; // 写入数据 unsigned char data = XBYTE[0x2000]; // 读取数据 } ``` #### 注意事项 1. ...

    #ifndef #define #endif的用法

    总结而言,`#ifndef`, `#define`, `#endif` 是 C/C++ 编程中非常重要的预处理指令,它们不仅可以帮助我们有效地管理头文件的包含,还可以用于实现条件编译等功能,是提高程序质量和可维护性的有力工具。

    预编译器——#include和#define的实现

    在实践中,现代的C编译器如GCC和Clang已经集成了高效的预处理器,它们处理`#include`和`#define`以及其他预处理指令的能力远超我们的简单实现。然而,理解这些基本概念对于任何想要深入研究编译器原理的开发者来说都...

    C语言中const与#define的区别

    在C语言中,定义常量通常可以使用const修饰符和#define预处理命令两种方式。这两种方法虽然在很多情况下可以互换,但它们之间存在一些本质的区别,了解这些区别对于编写高效、可维护的代码至关重要。 首先,我们来...

    常用宏定义#define

    在C/C++编程语言中,`#define` 是预处理器指令,用于创建宏定义,它在编译阶段执行文本替换,使得代码更加灵活且可定制化。宏定义是C/C++编程中的一个重要概念,它可以帮助程序员实现代码复用、简化复杂表达式、提供...

    C语言#define拼接宏定义实现方式

    使用场合:拼接两个宏,一个是传入的宏。但是传入的宏不会被替换,...#define DEFINE(X) DEFINE_(X) //再次定义 #define PARAM DEFINE(OBJECT) void fun() { // DEFINE_(OBJECT)=100; 这个操作是拒绝的,它就是直接拼

    #ifndef与#define及#endif_C语言_

    总结来说,`#ifndef`、`#define` 和 `#endif` 在C语言编程中用于实现头文件保护,防止头文件被多次包含导致的错误。`#ifndef` 检查宏是否已定义,`#define` 定义宏,`#endif` 结束条件预处理器指令块。理解并正确...

    #define 宏定义的一些用法总结

    在C及C++编程中,`#define`是一个非常强大的预处理器指令,用于创建宏。宏可以在编译前阶段替代代码片段,提高代码的复用性与可维护性。本文将详细探讨`#define`的各种使用场景及其背后的原理。 #### 二、基本结构 ...

    #indef 与#define 区别于用法

    ### #ifndef 与 #define 的区别及用法详解 #### 一、概述 在C/C++编程中,预处理指令是非常重要的组成部分,它们在编译前由预处理器执行,能够帮助开发者实现代码重用、条件编译等功能。本文将重点讨论 `#ifndef` ...

    #define用法集锦.doc

    在C/C++编程中,`#define`预处理器指令扮演着重要的角色,它可以用来定义常量、创建类似函数的功能以及实现条件编译等。下面我们将深入探讨`#define`的各种用法。 1. **简单的#define定义** `#define`常用于创建...

    宏定义#define用法总结

    C语言中宏定义#define用法总结 在 C 语言中,宏定义(#define)是一种非常重要的预处理器指令,它可以让我们在编译前对代码进行修改和扩展。本文将对宏定义的用法进行总结,包括简单的宏定义、带参数的宏、宏的特殊...

    C++/C 宏定义(define)中# ## 的含义

    在C++和C语言中,预处理器指令`#define`被广泛用于定义宏,这些宏可以包含简单的替换文本,也可以进行复杂的条件判断和参数处理。本文将详细介绍宏定义中的`#`和`##`符号的含义,并通过具体示例来说明它们的应用场景...

Global site tag (gtag.js) - Google Analytics