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

时间:2018-12-09 23:08:15

标签: c if-statement directive

我正在尝试使用#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
}

3 个答案:

答案 0 :(得分:2)

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

不建议在代码块内(例如,如果分支)甚至在函数内执行#define。 您没有指定代码的行为方式,但是如果#if始终以管理员模式运行,我不会感到惊讶。文件中之前有#define m 1(无论运行时执行采用什么路径),因此预处理器将采用第一个选项。

答案 1 :(得分:2)

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

一种以某种模式构建程序的方法是在编译时使用标志,例如-D DEBUG。请注意,我们不能在已编译的程序中使用它来选择模式。

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

答案 2 :(得分:2)

在C语言中,预处理器始终使用以“#”开头的指令。预处理程序会在编译之前扫描您的文件,以便对“变量” m进行硬编码,并且您无法在运行时(运行程序时)对其进行更改。 同样,声明但不使用“ m”变量。 要在运行时更改程序的行为,应使用标准变量,并使用开关箱来检查变量的值并运行适当的代码。

我还建议使用由“ 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;
}