C语言中怎样实现打印宏?(例如#define BBBBBBB 100000,然后输入为100000的时候打印出BBBBBB。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中怎样实现打印宏?(例如#define BBBBBBB 100000,然后输入为100000的时候打印出BBBBBB。相关的知识,希望对你有一定的参考价值。

就是实现格式化输出MyPrintf()函数。

编译型语言c是不能打印“预编译宏”的,
代码在编译前的预编译步骤时,所有的宏都已经被数据代替。BBBBBB都被换成100000,
再编译时已经看不到宏。编译后更只剩机器指令和数据。

对于重复的常量,现代编译器通常会优化,自动归为一个数据。不需要从常量找宏
现代的IDE也会列出项目中可用的宏。找宏也简单。追问

难道真的没有一点办法去实现了?我就是想实现格式化打印,例如下面MyPrintf()函数一样。

追答

你为什么要把格式化和宏联系上?你口中的“格式化”是指什么?举个例子。

追问

就是我想设计这样一种函数void MyPrintf(char*,int);它包含两个参数,第一个是字符串参数,第二个是整形参数。字符串参数就是要输出“宏名”,整形参数是为了控制那个要输出的“宏名”。例如,#define TestInt 10000;MyPrintf("%s\n",10000)的输出结果就是TestInt。谢谢你耐心的回答。

追答

这么做属于误用了-拿高层的操控想法在写低层的C代码。等于要对编译型语言做其他高级语言才有的反射操作-想要“控制语法成分”本身。编译语言在编译后,所有的C语言的语法结构已经不存在(没有if 没有int 没有define),执行档在运行时runtime已经不具有宏信息。
你可以做的,学数据结构,建立10000和testint的对应关系。比如构建散列表,红黑树表,建立字典关系,可以简单查找。
或者,建立最简单的2个数组int k[]; char *v[];
k[0]=10000; v[0]="testint";
k[i]=222; v[i]="hello"
通过i值实现关联,实现一个最简单散列关系。。

参考技术A 用#ifdef ,然后再判断你输入的数,如果相等就打印。
Myprintf(char *test,long n)
#ifdef TESTINT
if(10000 == n)
printf("%s",test);
#endif
参考技术B 可以用一个数组存放定义的宏,这样,从数组中搜索到“100000”后,再根据索引搜索"BBBBBBB" 参考技术C 不能这样用。#define 的作用说白了就是替换。只有在你的代码中出现100000 才会自动替换为BBBBBBB 。 但是如果你的100000是存在变量里面,那么是不起任何作用的。因为它不能追着变量去替换。 参考技术D 没看明白。。。。。。

C语言学习笔记--C语言中的宏定义

1. C 语言中的宏定义

1#define 预处理器处理的单元实体之一(因此,预处理器只是简单的进行替换,并
2#define 定义的宏可以出现在程序的任意位置(包括函数体的内部)
3#define 定义之后的代码都可以使用这个宏

2. 定义宏常量 

1#define 定义的宏常量可以直接使用
2#define 定义的宏常量本质为字面

3. 宏定义表达式

1#define 表达式的使用类似函数调用
2#define 表达式可以比函数更强大
3#define 表达式比函数更容易出错

#include <stdio.h>
#define _SUM_(a, b) (a) + (b)
#define _MIN_(a, b) ((a) < (b) ? (a) : (b))
#define _DIM_(a) sizeof(a)/sizeof(*a)
int main()
{
    int a = 1;
    int b = 2;
    int c[4] = {0};
    int s1 = _SUM_(a, b); //(a)+(b)
    int s2 = _SUM_(a, b) * _SUM_(a, b); //(a)+(b)*(a)+(b)
    int m = _MIN_(a++, b); //((a++)<(b)?(a++):(b))
    int d = _DIM_(c); //sizeof(c)/sizeof(*c);
    printf("s1 = %d\n", s1); // 3
    printf("s2 = %d\n", s2); // 5
    printf("m = %d\n", m); // 2
    printf("d = %d\n", d); // 4
    return 0;
}

4. 宏表达式与函数的对比

1)宏表达式被预处理器处理,编译器不知道宏表达式的存在
2)宏表达式用实参完全替代形参,不进行任何运算

3)宏表达式没有任何的调用开销

4)宏表达式中不能出现递归定义
内置宏

技术分享

技术分享

#include <stdio.h>
#include <malloc.h>
#define MALLOC(type, x) (type*)malloc(sizeof(type)*x)
#define FREE(p) (free(p), p=NULL)
#define LOG(s) printf("[%s] {%s:%d} %s \n", __DATE__, __FILE__,__LINE__, s)
#define FOREACH(i, m) for(i=0; i<m; i++)
#define BEGIN {
#define END }
int main()
{
    int x = 0;
    int* p = MALLOC(int, 5); //以 int 类型作为参数!
    LOG("Begin to run main code...");FOREACH(x, 5)
    BEGIN
    p[x] = x;
   END
    FOREACH(x, 5)
    BEGIN
    printf("%d\n", p[x]);
    END
    FREE(p);
    LOG("End");
    return 0;
}

 

以上是关于C语言中怎样实现打印宏?(例如#define BBBBBBB 100000,然后输入为100000的时候打印出BBBBBB。的主要内容,如果未能解决你的问题,请参考以下文章

C语言中的宏定义怎么用?

C语言中怎样修改宏定义呢

gcc编译汇编源码时怎样支持#define宏定义

C++ 中define(宏定义) 各种用法(含特殊),小举个例子,谢谢!

define的用法

C++中怎样写宏定义