LINUX.ORG.RU

условная компиляция

 


1

1

привет помогите разобраться с условной компиляцией...

#include <iostream>
#if defined(__g++__)
int main(int argc, char*argv[]){
std::cout << "hi forum";
return 0;
}

if defined в связке должны работать на мой взгляд таким образом: if будет обрабатывать код , если он истинен, defined выдаст единицу, если будет определен компилятор,что указан в скобках. то есть если буду компилить g++ то он даст единицу, и if обработает тогда , но вылетает ошибка на эту конструкцию. вобщем мой слабый рассудок не догонят. объясните, что не так?


  1. + не является допустимым символом. man

  2. Каждый #if должен завершаться #endif.

Не связано непосредственно с вопросом:

  1. Прикладывай код так, чтобы его было удобно читать – блок кода на C++ без отступов и подсветки синтаксиса не в радость.
  2. Если у тебя что-то не компилируется – прикладывай вывод компилятора, если в нем не можешь разобраться.
Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)

объясните, что не так?

Не вижу #endif.

Если __g++__ определён ранее (#define __g++__) код будет компилироваться, иначе пропускается мимо.

Deleted
()
Ответ на: комментарий от linuxpc

напишите пожалуйста простой пример использования if

cat jpeg2png/src/utils.h
...
#ifndef _ISOC11_SOURCE
  #include <malloc.h>
#endif
...
#if defined(_WIN32)
        void *p = _aligned_malloc(n, 16);
#else
  #ifdef _ISOC11_SOURCE
        void *p = aligned_alloc(16, n);
  #else
        void *p = memalign(16, n);
  #endif
#endif
...

С помощью данной условной компиляции, используются различные аллокаторы.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 2)
Ответ на: комментарий от Deleted

я правильно понял? вобщем ifdef , ifdefined, endif, else , elif.. . используются только в тексте кода, то есть в main(). и до их написания в тексте кода с каким либо токеном, этот токен должен быть описан уже с #define до функции main(). так? ну то есть

#include <iostream>
#define foo
int main(int  argc, char *argv[]){
#if defined(foo)
std::cout << thank;
endif foo
}

linuxpc
() автор топика
Ответ на: комментарий от linuxpc

хотя тут наверное это неуместно. да и понимание токена у меня неправильное)

linuxpc
() автор топика
Ответ на: комментарий от linuxpc

этот токен должен быть описан уже с #define до функции main()

Не обязательно. «Определение» может находится в «инклюдах» используемых либ или Makefile.

Нужен реальный пример? jpeg2png (GIT). Смотри src/utils.c.

Deleted
()
Ответ на: комментарий от Deleted

можно еще вопрос?

не могу понять про static global переменные и static local...

#include <iostream>
int a=11;// global variable
int main(int argc, char *argv[]){
while(1){int static a=11; std::cout << a << ::a;}//::тут я расширил пространство имен. теперь "a" будет видно со значением =11;  то есть из глобальной видимости. 

}


так вот, не доходит, до меня в чем отличие static local от глобальной переменной. когда static указываю, то значит что переменная объявленная внутри блока кода{то есть тут} не исчезнет после того как цикл или функция выполнится. то есть для нее будет зарезервированная память, так же как и под глобальную переменную , только видна она будет в блоке кода. я так понял. но если я припишу static к глобальной переменной, то ее область видимости уменьшится и она будет видна только в том месте ,где определена. блин, вот это как? в чем тогда отличие от static local и static global? живут они что та что эта одинаково долго, область видимости у них у обеих ограничена? с скажите пожалуйста, в чем их отличие?

и еще , можно ли расширить пространство имен ::variable и сделать эту локальную переменную , видимую за пределами блока кода? то есть

while(1){int var=5; }; std::cout << var;//как ее от сюда прочитать* 

linuxpc
() автор топика
Ответ на: комментарий от linuxpc

когда static указываю, то значит что переменная объявленная внутри блока кода{то есть тут} не исчезнет после того как цикл или функция выполнится

Static указывает выделять память внутри блока кода {}. Это выделение не будет высвобождено, пока не высвобожден сам блок.

и еще , можно ли расширить пространство имен ::variable и сделать эту локальную переменную , видимую за пределами блока кода?

int var;
while(1){var=5;};
std::cout << var; 

Вынеси выделение памяти (определение) переменной за пределы блока.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 2)
Ответ на: комментарий от linuxpc

чем же отличается static global variable от static locale varibale?

Тем, где это variable будет физически располагаться в памяти.

Deleted
()
Ответ на: комментарий от Deleted

Вы такое немногословный))) ну ладно хоть это

linuxpc
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.