在 c 中使用 #if 创建程序模式

create program modes using #if in c

我正在尝试使用 #if#define 为程序创建两种模式,但第二种模式不起作用,这是为什么? 如果您能提出更好的方法,我将不胜感激。

这是我的代码:

#include "Types.h"
#include <stdio.h>


void main (void)
{
    u32 m;
    u32 flag = 1;
    do 
    {
        printf("\nWelcome\nPress 1 for Admin mode\nPress 2 for User Mode\nYour Choice:");
        scanf("%d",&m);
        if (m==1)
        {
            #define m 1
            flag = 0;
        }
        else if (m==2)
        {
            #define n 2
            flag = 0;
        }
        else 
        {
            printf("\nInvalid number \nPlease Try again");
        }
    }while(flag);

//using conditional directive to run only the portion of the code for the slected mode  
#if m==1
printf("Welcome to admin mode");

#elif n==2
printf("Welcome to user mode");

#endif
}

预处理器 if #if 只能解释在处​​理时已知的值,甚至在编译时之前。
它无法从 u32 m.
等变量中读取值 另一方面,预处理器 #define 也只在预处理时完成,它不会受到 "then" 分支或 if 的 "else" 分支的影响.

不推荐在代码块(例如分支)甚至函数内执行 #defines。 您没有指定您的代码如何行为不端,但如果 #if 始终以管理员模式运行,我不会感到惊讶。文件中之前已经有一个#define m 1(无论运行时执行的路径是什么),所以proprocessor会选择第一个选项。

#define 和 ifs 是预处理器宏的一部分。 考虑它们的一种方法是想象编译器遍历您的文件并在其中剪切和粘贴作为编译的早期步骤。例如,当您将 PI 定义为 3 时,它会在您编写 PI 的代码中的任何位置粘贴 3。然后这告诉我们,当 运行 程序时,我们进入 m == 1 或 2 的哪个分支并不重要 - 所有预处理器编辑都已经完成!

在特定模式下构建程序的一种方法是在编译时使用标志,例如 -D DEBUG。请注意,我们不能在已编译的程序中将此用于 select 模式。

预处理器选项: -D= 添加一个隐式#define 到预定义缓冲区中,该缓冲区在源文件被读取之前被读取 预处理。

在C语言中,所有以“#”开头的指令都被预处理器使用。预处理器在编译之前扫描您的文件,以便 "variable" m 被硬编码并且您无法在 运行 时间内更改它(当您 运行 正在运行程序时)。 此外,"m" 变量已声明但未使用。 要在 运行 时间更改程序的行为,您应该使用标准变量并使用 switch-case 检查变量的值和 运行 适当的代码。

我还建议使用 "int" 或 "char" 等语言定义的标准类型,因为它们在不同的体系结构中具有更好的可移植性。

你的代码可能是这样的

#include <stdio.h>

int main (void)
{
  int m;
  do
  {
    printf("\nWelcome\nPress 1 for Admin mode\nPress 2 for User Mode\nYour Choice:");
    scanf("%d",&m);
    if (m == 1)
    {
      printf("Welcome to admin mode");
      return 0;
    }
    else if (m == 2)
    {
      printf("Welcome to user mode");
      return 0;
    }
    else
    {
      printf("\nInvalid number \nPlease Try again");
    }
  }while(m != 1 || m != 2);
  return 0;
}