【问题标题】:Automatically replacing variables with #defines使用#defines 自动替换变量
【发布时间】:2010-10-06 04:56:55
【问题描述】:

我有一个文件,其中包含大约 100 个#define,从 1 到 100,每个都有一个唯一的字符串值。

现在我正在尝试打印此值,但我想打印#define 是什么而不是该值。例如:

#define FIRST_VALUE 1
var = FIRST_VALUE;
printf("%s", var);

我希望 printf 打印 FIRST_VALUE,而不是 1。

有没有办法在 C 中做到这一点?还是我必须在 switch 语句中写出 100 多个 case 块?

【问题讨论】:

    标签: c string replace c-preprocessor


    【解决方案1】:

    您可以使用stringification 来实现您要查找的内容:

      #define FIRST_MACRO
      #define MACRO_TO_STRING(x) #x
    
      #include <stdio.h>
    
      main() {
         printf("%s\n",  MACRO_TO_STRING(FIRST_MACRO));
      }
    

    这个程序会输出:

    FIRST_MACRO

    【讨论】:

    • 这就是我在提到 Windows 消息映射时的意思,我相信它使用了类似的机制。
    • 不过,这并不能真正回答最初的问题。他想根据变量的值动态打印宏“名称”。
    【解决方案2】:

    在与我在学校的一位助教交谈后,我们决定最好的方法是编写一个 AWK 脚本来处理头文件并自动生成所有需要的案例语句。

    谢谢大家!

    【讨论】:

      【解决方案3】:

      您不能完全按照您的意愿行事,因为当编译器获得预处理器输出时,“ONE”标记早已不复存在。但是,如果您的目标是编写一次常量列表但同时生成标记和字符串,则可以这样做。

      首先,使用宏将常量构建为头文件中的枚举。文件枚举.h:

      #ifndef ENUMS_H #define ENUMS_H #ifndef 枚举 #define ENUM(name,val) enum { name = val }; #万一 枚举(一,1) 枚举(二,2) 枚举(三,3) #endif /* ENUMS_H */

      其次,在 .c 文件中重新定义宏以创建字符串/整数映射并将 .h 文件包含在正确的位置。文件枚举.c:

      #包括 #包括 类型定义结构{ 字符 *str; 整数值; } 描述枚举; 静态 DescriptiveEnum 枚举[] = { #define ENUM(name,val) { #name, val }, #include “枚举.h” }; #define NUM_ENUMS (sizeof(enums)/sizeof(enums[0])) char *enum_to_str(int val) { 诠释我; 对于 (i=0;i

      现在枚举常量和映射函数都可供调用者使用。文件 main.c:

      #include #include #include “枚举.h” char *enum_to_str(int val); int main(int argc, char *argv[]) { 整数值; 值=一; printf("%d %s\n",val,enum_to_str(val)); 返回 EXIT_SUCCESS; }

      【讨论】:

        猜你喜欢
        • 2011-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-30
        • 1970-01-01
        • 2016-10-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多