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