Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将任意代码块作为参数传递给C宏_C++_Macros_Comma - Fatal编程技术网

C++ 如何将任意代码块作为参数传递给C宏

C++ 如何将任意代码块作为参数传递给C宏,c++,macros,comma,C++,Macros,Comma,我想创建一个宏,它将接受任意代码块作为参数,就像 FOR_VECTOR( type, vect, code_block ) \ for( vector<type>::iterator i=vect.begin(); i!=vect.end(); ++i ) { \ code_block; \ } _向量的(类型、向量、代码块)\ 对于(向量::迭代器i=vect.begin();i!=vect.end();++i){\ 代码块\ } 问题在于参数中的代码块,它可能

我想创建一个宏,它将接受任意代码块作为参数,就像

FOR_VECTOR( type, vect, code_block ) \
  for( vector<type>::iterator i=vect.begin(); i!=vect.end(); ++i ) { \
    code_block; \
  }
_向量的
(类型、向量、代码块)\
对于(向量::迭代器i=vect.begin();i!=vect.end();++i){\
代码块\
}
问题在于参数中的代码块,它可能包含任意数量的
字符


有什么好的解决办法吗?

有许多可能的解决办法

如果您只需要一个表达式(不是一个完整的代码块),您可以将它括在

将起作用-
(func(i,1))
被视为单个宏参数

另一个部分解决方案是,如果预处理器支持它们

您可以定义宏

#define COMMA ,
#define LPAR (
#define RPAR )
并使用它们形成代码块,而不是真正的

但它的可读性不强

或者,您可以在宏替换后注释掉字符串文字的引号:

FOR_VECTOR( type, vect, code_block ) \
  for( vector<type>::iterator i=vect.begin(); i!=vect.end(); ++i ) { \
    /code_block/; \
  }

FOR_VECTOR( int, v, *"*/ func(i,1); proc(i,2); /*"* )
_向量的
(类型、向量、代码块)\
对于(向量::迭代器i=vect.begin();i!=vect.end();++i){\
/代码_block/\
}
对于_向量(int,v,*“*/func(i,1);proc(i,2);/*”*)

如@mas.morozov所述,您可以使用可变宏:

#包括
#包括
#定义_向量(类型、向量等)\
对于(std::vector::迭代器i=vect.begin();i!=vect.end();++i){\
__瓦努阿格斯\
}
int main()
{
向量v={1,2,3,4,5,6};
对于_向量(int,v{

STD::你的意思是“不做那件事”?你熟悉函数?函数?还是在C++ 11中,LAMDAS?他说了什么。除此之外,括号化了。预处理器足够聪明,能识别括号。好,我会考虑所有的替代方案,但我想要这样的宏:我不能插入完整的代码块,只有一个表达式。我为除您以外需要维护代码的任何人哭泣。:)这是否有效?我尝试过的所有编译器都给出了一个错误。无论如何,这不应该产生
/*
标记。预处理器在替换宏参数时不会粘贴标记。您必须编写<代码> /μ>代码块,但这不会产生有效的令牌:<代码>错误:粘贴“/”和“*”不给出有效的预处理令牌。@ HeDEDE是从实际有效的C++代码中获取的,编译在2007附近。在任何合理的代码风格约定中,在把lambda函数引入C++之后,我认为这样做绝对没有意义。我将更新答案来讲述它。
FOR_VECTOR( int, v, func LPAR i COMMA 1 RPAR )
FOR_VECTOR( type, vect, code_block ) \
  for( vector<type>::iterator i=vect.begin(); i!=vect.end(); ++i ) { \
    /code_block/; \
  }

FOR_VECTOR( int, v, *"*/ func(i,1); proc(i,2); /*"* )
#include <iostream>
#include <vector>

#define FOR_CONTAINER( container, ... ) \
  for( decltype(container)::iterator i=container.begin(); i!=container.end(); ++i ) { \
    __VA_ARGS__ \
  }

int main()
{
    std::vector<int> v = {1, 2, 3, 4, 5, 6};
    FOR_CONTAINER(v, {
        std::cout << *i << std::endl;
    })
}