#undef c linux

2017-12-27 15:19:58 qq_28349403 阅读数 2177
  • 多任务的裸机实现(下)

    通过本课程学习,让嵌入式学员对对整个嵌入式系统、CPU内部、操作系统都有一个全局的把握和认识,为后续的Linux内核、驱动开发等高阶课程打下良好的理论基础。掌握这些知识后,会让我们后续的课程更加轻松、学习效率...

    33人学习 王利涛
    免费试看

用法:#undef 标识符

其中,标识符是一个宏名称。如果标识符当前没有被定义成一个宏名称,则忽略该指令。

如果定义预处理器标识符,那么它将保持已定义状态且在作用域内,直到程序结束或者使用#undef指令取消定义。例如:起初定义了一个标识符,之后#undef 标识符,在该行之后,又调用该标识符,则程序会编译出错。

列举一个实例:从网上看到的

#include <iostream> 
  #include<string>
  #define MAX 5 
  #undef MAX 
  void main() 
  { 
  char name[MAX]="abcde"; //只能用abcd,否则会提示说超出长度,原因大概是"/0"字符
  cout<<"MAX = "<<MAX<<endl; 
  for(int i=0;i<MAX;i++) 
  cout<<name<<" "<<endl;
  } 

其中的MAX,就是上面所说的情况。

2018-03-22 16:04:36 sweetfather 阅读数 10291
  • 多任务的裸机实现(下)

    通过本课程学习,让嵌入式学员对对整个嵌入式系统、CPU内部、操作系统都有一个全局的把握和认识,为后续的Linux内核、驱动开发等高阶课程打下良好的理论基础。掌握这些知识后,会让我们后续的课程更加轻松、学习效率...

    33人学习 王利涛
    免费试看
程序示例:
修改已经宏定义的符号常量的值:
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main( void )
{
#define MAX 200
    printf("MAX= %d\n",MAX);
#undef MAX
#define MAX 300
    printf("MAX= %d\n",MAX);
    return 0;
}

#undef  #undef 是在后面取消以前定义的宏定义
  该指令的形式为 
  #undef 标识符
  其中,标识符是一个宏名称。如果标识符当前没有被定义成一个宏名称,那么就会忽略该指令。
  一旦定义预处理器标识符,它将保持已定义状态且在作用域内,直到程序结束或者使用#undef 指令取消定义。 
  在此程序中,我们将取消在先前程序中对预处理器的定义。 
  #include <iostream> 
  #include<string>
  #define MAX 5 
  #undef MAX 
  void main() 
  { 
  char name[MAX]="abcde"; //只能用abcd,否则会提示说超出长度,原因大概是"/0"字符
  cout<<"MAX = "<<MAX<<endl; 
  for(int i=0;i<MAX;i++) 
  cout<<name<<" "<<endl;
  } 
  得到如下错误消息 
  未定义符号 'MAX' 
  初始值设定项太多 
  在此程序中对 MAX 定义后又取消了定义。编译该程序时报错。由于未定义 MAX,char name[MAX] 的数组大小不可用,因此编译器发出第二个错误消息。
  又如
  #define TEST_A 1 
  #define TEST_CLASS_A clase T1 
  #include "TEST.h" 
  #undef TEST_A 
  #undef TEST_CLASS_A 
  在这一个文件中使用宏定义:#define TEST_A 1 
  #define TEST_CLASS_A clase T1 
  出了#include "TEST.h" 这个文件宏定义释放掉 
  就是这个意思 
  也就是在文件#include "TEST.h" 中宏定义#define TEST_A 1 
  #define TEST_CLASS_A clase T1 起作用,过了这一语句宏定义就释放掉了,在test.h里,这个宏是有效的,然后出了这个头文件,又无效了。

2013-04-30 12:54:39 jkhere 阅读数 6792
  • 多任务的裸机实现(下)

    通过本课程学习,让嵌入式学员对对整个嵌入式系统、CPU内部、操作系统都有一个全局的把握和认识,为后续的Linux内核、驱动开发等高阶课程打下良好的理论基础。掌握这些知识后,会让我们后续的课程更加轻松、学习效率...

    33人学习 王利涛
    免费试看

#undef 是在后面取消以前定义的宏定义   
该指令的形式为   
#undef 标识符   
其中,标识符是一个宏名称。如果标识符当前没有被定义成一个宏名称,那么就会忽略该指令。   
一旦定义预处理器标识符,它将保持已定义状态且在作用域内,直到程序结束或者使用#undef 指令取消定义。

#include <stdio.h>
#include <stdlib.h>

#define Max 5
#undef Max
int main()
{
    printf("Max is:%d\n",Max);//Max is not defined
    return 0;
}



 


 

2013-08-20 11:03:00 demon26530 阅读数 152
  • 多任务的裸机实现(下)

    通过本课程学习,让嵌入式学员对对整个嵌入式系统、CPU内部、操作系统都有一个全局的把握和认识,为后续的Linux内核、驱动开发等高阶课程打下良好的理论基础。掌握这些知识后,会让我们后续的课程更加轻松、学习效率...

    33人学习 王利涛
    免费试看

        C#的预处理命令其实还是蛮有用的,但是真正使用过得人不多,这个介绍一下平时用的比较多的预处理命令中的几个:#define,#undef ,#if,#endif.除此之外还有一些预处理命令#warning,#error,#region#endregion,#line,#pragma等,在这里就不一一介绍,都比较简单。

        使用预处理器指令可以禁止编译器编译代码的某一部分,如果计划发布两个版本的代码,即基本版本和拥有更多功能的企业版本,就可以使用这些预处理指令,在编译软件的基本版本时,使用预处理器可以禁止编译器编译与额外功能的相关代码。另外在编写提供调试信息的代码时,也可以使用预处理器指令。

        下面给一个例子:

         int DoSomeWork(double x)

        {

              #if DEBUG   //"DEBUG"在VS编译器中是默认存在的,如需修改可以到项目的属性中去休息 所以这个代码默认也是会被执行的

                  Console.WriteLine(x);

               #endif

         }

 

         int DoSomeWork(double x)

        {

              #if MYSELF//这个默认是不会被执行,如果需要其执行需要定义#define MYSELF, 位置是在代码文件中的第一行,删除可以用#undef

                  Console.WriteLine(x);

               #endif

         }

        

       ps:好久没到博客园来写自己的东西了,主要也不是没时间,可能是下班之后就玩去了吧,没有花啥时间去自己学习,很是惭愧,写的东西都很肤浅,只是让自己养成一个学习的好习惯。

 

 

转载于:https://www.cnblogs.com/wuxiangjiang/p/3255195.html

2018-09-17 13:06:15 weixin_41892460 阅读数 1203
  • 多任务的裸机实现(下)

    通过本课程学习,让嵌入式学员对对整个嵌入式系统、CPU内部、操作系统都有一个全局的把握和认识,为后续的Linux内核、驱动开发等高阶课程打下良好的理论基础。掌握这些知识后,会让我们后续的课程更加轻松、学习效率...

    33人学习 王利涛
    免费试看

1.#define

1)定义标识符

ef:#define在预处理阶段替代所有的Max

#define Max 100
int main()
{
	printf("%d\n", Max);
	system("pause");
	return 0;
}

define定义标识符的时候,不要轻易在最后加;可能造成语法错误。
eg:

#define Max 100;

int main()
{
	int max = 0;
	if (1)
	{
		max = Max;
	}
	else
		max = -1;
	system("pause");
	return 0;
}

2)#define定义宏

#defien 机制包括一个规定,允许把参数替换到文本中,这个实现通常成为宏。
下面是宏的申明方式:
#define name( a ) stuff
其中a是一个由逗号隔开的符号表,它们可能出现在stuff中
注意
参数列表的左括号必须与name紧邻
eg:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>

#define MAX(X,Y)  X>Y?X:Y
int  main()
{
	int a = 10;
	int b = 20;
	int max = MAX(a, b);
	printf("%d", max);
	system("pause");
	return 0;
}

下面代码想输出64却不行思考解决方法:

#define MAX(X,Y)  X>Y?X:Y
#define S(x) x*x
int  main()
{
	int a = 10;
	int b = 20;
	int max = S(3+5);
	printf("%d", max);
	system("pause");
	return 0;
}

解决方法:在宏定义的两边加上一对括号,如下

#define MAX(X,Y)  X>Y?X:Y
#define S(x) (x)*(x)
int  main()
{
	int a = 10;
	int b = 20;
	int max = S(3+5);
	printf("%d", max);
	system("pause");
	return 0;
}

所以用于对数值表达式进行求值的宏定义都应该用这种方式加上括号,避免在使用宏时由于参数中的操作符或临近操作符之间不可预料的相互作用;

3)define的替代

1.在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号,如果是,它们首先被替代
2.替代文本随后被插入到程序中原本文本的位置,对于宏,参数名被它们的值替代。
3.最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的服符号,如果是,就重复上述的处理过程

注意

  • 宏参数和#define定义中可以出现#define定义的变量,但是对于宏,不能出现递归
  • 当预处理搜索#define定义的符号的时候,字符串常量的内容并不被搜索

2.#和##和#undef

1)使用#可以把一个宏参数变为一个对应的字符串

eg:

#define Print(val,format)  printf("the value of "#val" is "format, val)
int main()
{
	int a = 9;
	Print(a, "%d");
	system("pause");
	return 0;
}

运行结果为:
这里写图片描述

2)##可以把位于它两边的符号合并为一个符号,它允许宏定义从分离的文本片段创建标识符

eg:

#define Cat(x,y) x##y
int main()
{
	int test38 = 10;
	printf("%d\n", Cat(test, 38));
	system("pause");
	return 0;
}

输出结果为10;

3.#undef

这个预处理指令用于移除一个指定的宏定义

格式:#undef NAME

3.宏和函数

有时候宏和函数可以完成相同的功能


  • 优点
    1.宏比函数在程序的规模和速度方面更胜一筹
    2.宏是类型无关的,可以适用于整形,长整形,浮点型等等类型。
    劣处
    1.每次使用宏的时候,一份宏定义的代码将插入到程序中,除非宏比较短,否则可能大幅度增加程序的长度
    2.宏是没法调试的
    3.宏类型无关,也不够严谨
    4.宏可能会带来运算符优先级的问题,导致程序容易出错
  • 函数
  • 优处
    1.函数代码 出现于一个地方,每次使用这个函数,都调用用一块程序代码
    2.函数参数只在函数调用时求值一次,它的结果值传递给函数,表达式的求值结果更容易猜测
    3.参数在函数被调用前只求值一次,在函数中的副作用并不会造成任何特殊的问题
    劣处
    1.存在函数调用返回的额外开销
    2.函数的参数是与类型无关的,如果参数的类型不同,就需要使用不同的函数,即使它们执行的任务是相同的

还有一些代码是使用函数无法实现的比如下面这个动态分配空间使用函数是无法实现的:


#include<stdio.h>
 
#define MALLOC(a, type)  \
	((type*)malloc((a)*sizeof(type)))//动态申请了10个type类型的空间
 
int main()
{
	int *p = MALLOC(10, int);  //給指针p动态分配了10个int类型的空间

       free(p);
	return 0;
}

因为宏的第二个参数是一个类型,类型可以作为宏的参数进行传递,不可以作为函数的参数进行传递。

#undef的用处

阅读数 3

linux debug技巧

阅读数 3249