Макрос с переменными всегда определяется с помощью переменной или констант? - PullRequest
0 голосов
/ 27 апреля 2011

Если у меня есть такой макрос в функции:

void SomeFunc(int arg1, int arg2)
{
    float value1, value2;
    float range;

//#define MatrixBlock   MyMatrix.block<arg1,arg2>(value1, value2)
//#define BlockRange     MatrixBlock.block<arg2, range>
  #define MatrixBlock    MyMatrix.block(value1, value2, arg1, arg2)
  #define BlockRange     MatrixBlock.block(value1, value2, 0, range)

    /* My code using the above macros */

    // Are the following lines necessary? What will happen if I don't undefine the macro?
#undef MatrixBlock
#undef BlockRange
}

Получит ли он новые значения arg1 и arg2 каждый раз или они будут исправлены при первом обнаружении макроса? Мне нужно #undef? Что произойдет, если у меня нет #undef s

Ответы [ 3 ]

3 голосов
/ 27 апреля 2011

Макросы выполняют текстовую замену, в основном так же, как если бы вы выполняли поиск и замену в текстовом редакторе.Результат этого передается компилятору C для анализа и генерации кода.

Макросу не важно, что такое arg1 и arg2, он просто заменяет строку MatrixBlock на строкуMyMatrix.block<arg1,arg2>(value1, value2).Как результат интерпретируется, зависит от компилятора.

2 голосов
/ 27 апреля 2011

Макрос - это просто текстовая подстановка.

В своем коде вы определили подстановки, но никогда не выполняли их.Вам нужно будет сделать что-то вроде:

void SomeFunc(int arg1, int arg2) {
    float value1, value2;
    float range;  
#define MatrixBlock MyMatrix.block<arg1,arg2>(value1, value2) 
#define BlockRange   MatrixBlock.block<arg2, range>      

    MatrixBlock; // as if you had written MyMatrix.block<arg1,arg2>(value1, value2); in the code
    BlockRange myRange; // as if you had written MatrixBlock.block<arg2, range> myRange; in the code
/* My code using the above macros */
// Are the following lines necessary? What will happen if I don't undefine the macro? 

#undef MatrixBlock 
#undef BlockRange 
} 

Так что да, вы будете получать текущие значения arg1, arg2, value1, value2, range при каждом вызове функции.Я заметил, что вы пытаетесь специализировать шаблон со значениями времени выполнения, которые, я не думаю, будут работать.

Если вы не undef макросы, они будут доступны для всего кода, следующего заdefine s, поэтому некоторые последующие методы могут использовать их.Если это находится в заголовочном файле, то все, что включает его, будет иметь доступ к этим макросам.

Это необычно иметь определения внутри метода, но не неслыханно.

1 голос
/ 27 апреля 2011

Макросы обрабатываются как текстовые замены в отдельном проходе, прежде чем компилятор увидит код. Они ничего не знают о функциях и параметрах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...