создавать режимы программы используя #if в c - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь создать два режима для программы, используя #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 голосов
/ 10 декабря 2018

#define и ifs являются частью макроса препроцессора.Один из способов думать о них - представить, как компилятор просматривает ваши файлы, вырезает и вставляет их в качестве раннего этапа компиляции.Когда вы определите, например, PI как 3, он вставит 3 в ваш код, в который вы написали PI.Затем это говорит нам, что не имеет значения, какую ветвь m == 1 или 2 мы пропустим при запуске программы - все редактирование препроцессора уже завершено!

Один из способов встроить программуопределенный режим будет использовать флаг при компиляции, например -D DEBUG.Обратите внимание, что мы не можем использовать это для выбора режима в уже скомпилированной программе.

Опции препроцессора: -D = Добавляет неявный #define в буфер предопределений, который читается до предварительной обработки исходного файла.

0 голосов
/ 10 декабря 2018

В языке 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;
}
0 голосов
/ 10 декабря 2018

Препроцессор, если #if может интерпретировать только те значения, которые известны во время обработки, то есть даже до времени компиляции.
Он не может читать значения из переменных, таких как u32 m.
С другой стороны,препроцессор #define также выполняется только во время предварительной обработки, на него не будет влиять то, что он находится внутри ветви "then" или ветви "else" if.

Doing #define s в пределахблоки кода (например, ветвления) или даже внутри функции не рекомендуются.Вы не указали, как ваш код ведет себя неправильно, но я не удивлюсь, если #if всегда действует в режиме администратора.Ранее в файле был #define m 1 (независимо от того, какой путь выполнения выполнялся), поэтому пропроцессор выберет первый вариант.

...