在C / C ++预处理器中获取宏参数的不同部分

时间:2015-08-14 04:06:50

标签: c++ macros

我们知道在宏观中,我们可以传递一些任意的东西,例如

#define A(x) void func(x)
#define B(x) func(x)
// to define a function
A(int x) {...}
// to call a function
B(1);

您可能会看到两个宏的参数完全不同。 我的问题是,对于第一种情况,是否有解决方案来获取宏参数的不同部分:

#define A(x) void func(x) { PART1(x) a = 1; std::cout << (a+PART2(x)); }
A(int x)
// will expand to:
// void func(int x) { int a = 1; std::cout << (a+x); }
func(1);
// outputs 2

是否可以实施PART1和PART2?

1 个答案:

答案 0 :(得分:1)

是否可以实施PART1和PART2?

是的......有点儿。 AFAIK是挑选和丢弃由空格分隔的参数的唯一方法是对一个部分应用模式匹配,这应该是众所周知的和标识符。为了适合你的例子,它的工作方式如下:

angular.module('PremierLeagueApp.services', []).
  factory('footballdataAPIservice', function($http) {

    var footballdataAPI = {};

    footballdataAPI.getTeams = function() {
        $http.defaults.headers.common['Auth-Token'] = 'token';
      return $http.get('http://www.football-data.org/alpha/soccerseasons/398/leagueTable?callback=JSON_CALLBACK');
    };
    return footballdataAPI;
  });

一切都在SECOND之外,它给你第二个参数。 EXTRACTOR_foo的工作就是让foo独自成为第二个参数。 SHIFTER_foo的工作是消耗foo,发出逗号,剩下的就是第二个参数。 SECOND选择了这个论点并丢弃了匹配者产生的垃圾。