#define和期望的主表达式错误

时间:2017-07-16 17:53:20

标签: c++ c-preprocessor

以下代码在尝试在Linux上编译时会导致“在'之前预期的primary-expression'''token”错误:

#define PRINTF(args, ...) printf((args), __VA_ARGS__)

void test( )
{
   PRINTF( "test" );
}

相同的代码在Windows上运行正常。我不确定问题是什么。

解决方案:

__VA_ARGS__之前添加##解决问题

1 个答案:

答案 0 :(得分:3)

在标准C中,'use strict'; var googleapi = require('googleapis'); var ApiKeyFile = require('mywebsiteGAapi-6116b1dg49a1.json'); var viewID = 'ga:123456700'; var google = getdefaultObj(googleapi); var Key = getdefaultObj(ApiKeyFile); function getdefaultObj(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var jwtClient = new google.default.auth.JWT(Key.default.client_email, null, Key.default.private_key, ['https://www.googleapis.com/auth/analytics.readonly'], null); jwtClient.authorize(function (err, tokens) { if (err) { console.log(err); return; } var analytics = google.default.analytics('v3'); queryData(analytics); }); function queryData(analytics) { analytics.data.ga.get({ 'auth': jwtClient, 'ids': viewID, 'metrics': 'ga:users,ga:pageviews', 'start-date': 'yesterday', 'end-date': 'today', }, function (err, response) { if (err) { console.log(err); return; } console.log(JSON.stringify(response, null, 4)); }); } 表示对#define PRINTF(args, ...)宏的任何调用都必须提供至少两个参数。

GNU预处理器提供了两个扩展:

  • 在这种情况下可以提供一个参数,并且它的行为就像提供了第二个空参数一样。
  • 扩展中允许
  • PRINTF含义:
    • 如果发生前一个项目符号点的空参数扩展,则全部扩展为空(即没有尾随逗号)
    • 否则,其行为为, ## __VA_ARGS__

如果您看到编译器接受您的原始代码,则表示正在使用的预处理器提供非标准扩展。相反,您的解决方案"可能不适用于某些实现。