Блог пользователя difask

Автор difask, 9 лет назад, По-русски

Я видел, что в С++ можно писать что то типа.

#ifdef something

...

#endif

Где можно настроить это something? Я использую CodeBlocks. Спасибо!

  • Проголосовать: нравится
  • +8
  • Проголосовать: не нравится

»
9 лет назад, # |
Rev. 5   Проголосовать: нравится 0 Проголосовать: не нравится

#include <iostream> #include <cstdio> using namespace std; #define smth int main() { #ifdef smth puts("smth is defined"); #else puts("smth is not defined"); #endif #ifndef smth // #ifnfed = !ifdef puts("smth is not defined"); #else puts("smth is defined"); #endif return 0; }
  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Я не про это. Например я хочу подключить файлы. Некоторые кфщики пишут вот-так :

    #ifdef nickname

    freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);

    #elseif

    freopen(name".in", "r", stdin); freopen(file".out", "w", stdout);

    #endif Тоесть на компютере и тестере должны исполнться разные куски кода.

    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Лично я всегда делал так:

      //#define DEBUG
      #define TASKNAME ""
      
      ...
      
         #ifdef DEBUG
              freopen (TASKNAME".in", "r", stdin);
             	freopen (TASKNAME".out", "w", stdout);
          #else
              freopen ("input.txt", "r", stdin);
              freopen ("output.txt", "w", stdout);
          #endif
      

      Нужно вывести на консоль — часть после #else сделал комментарием
      Нужно вывести в файл TASKNAME — снял комментарий с DEBUG
      Нужно в input.txt — оставил все как есть

      Занимает это все буквально 2 секунды, уж поверьте, никакой лишней ерунды, уж поверьте

  • »
    »
    9 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    Ваш код не совсем то, что я хотел. И он не компилируется. ideone Хотя это тоже крутая штука. Спасибо! И все же вы знаете как сделать такую фишку, как в предыдущем комментарии?

    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Забыл подключить cstdio, теперь все в порядке

      • »
        »
        »
        »
        9 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Спасибо. Это удобней. Но возможно кто-то знает это. Вот кстати 6206655 с использованием етой штуки

        • »
          »
          »
          »
          »
          9 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Ну так все правильно
          air нигде не объявлен, вот файлы и не открываются.
          Скорее всего у автора в шаблоне air подключен, а в процессе написания кода он просто удалил строку #define air

»
9 лет назад, # |
  Проголосовать: нравится +2 Проголосовать: не нравится

Вот здесь: http://www.codeblocks.org/docs/main_codeblocks_en3.html#x3-270001.11.6

А вообще можно писать

#ifndef ONLINE_JUDGE
  // Local stuff
#endif

так как многими серверами это поддерживается.

»
9 лет назад, # |
  Проголосовать: нравится +12 Проголосовать: не нравится

This can be done in the compiler settings of your IDE. Usually they allow you to pass some arguments to the compiler invocation. You need to pass the argument:

-D something

»
9 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

You could enable by putting #define something 1 before that #ifdef :

#define something 
#ifdef something
...
#endif
»
9 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

you could enable by putting #define something 1 before that #ifdef :

#define something
#ifdef something
...
#endif
»
9 лет назад, # |
Rev. 3   Проголосовать: нравится +2 Проголосовать: не нравится

This is a simple example for #ifdef, #ifndef and #else you can also have #elif which works like else if and there is #if that works like if;

#define HelloWorld

#ifdef HelloWorld
#define ByeWorld
// This line will be executed
#else
#define HelloWorld
// This line won't be executed
#endif

#ifndef HolaMundo
#define HolaMundo
// This line will be executed
#else
#define AdiosMundo
// This line won't be executed
#endif
»
9 лет назад, # |
  Проголосовать: нравится +18 Проголосовать: не нравится

"something" можно передать в аргументах компилятора:

g++ -Dsomething test.cpp

Если ваш проект в CodeBlocks использует CMake, откройте файл CMakeLists.txt и добавьте туда строчку

add_definitions(-Dsomething)

там же можно добавить все опции, перечисленные в этом посте, например:

add_compile_options("-std=c++11" "-O2" "-Wall" "-Wextra")
»
9 лет назад, # |
  Проголосовать: нравится +13 Проголосовать: не нравится

For Codeblocks: Settings -> Compiler.

If you invoke gcc manually: g++ -DSOMETHING ...