【发布时间】:2020-01-02 18:39:02
【问题描述】:
我有这样的测试程序:
#ifdef _WINDOWS
#include "stdafx.h"
#endif
#include "string.h"
#include "stdio.h"
#define ENTYPEDATA_STEP_3_D 3
#define ENTYPEDATA_STEP_10_2F 10
#define ENTYPEDATA_STEP_HEADER_4_D (4)
#define UINT unsigned int
#define SBUF_HEADER_INIT(n, data, m)\
sprintf(cTmpTb,"%d",##m);\
strcpy(cTmpTf,"%");\
strcat(cTmpTf,cTmpTb);\
strcat(cTmpTf,"d");\
sprintf(TmpHeaderBuf,cTmpTf,data);\
strcpy(this->m_pBufs##n,TmpHeaderBuf);
class m_test {
private:
char TmpHeaderBuf[ENTYPEDATA_STEP_HEADER_4_D+1];
char cTmpTb[50];
char cTmpTf[50];
char TmpBuf[ENTYPEDATA_STEP_10_2F+1];
char *m_pBufs0;
char *m_pBufs5;
public:
m_test();
~m_test();
};
int main(int argc, char* argv[]){
m_test l_test;
return 0;
}
m_test::m_test(){
m_pBufs0= new char[20];
m_pBufs5= new char[20];
SBUF_HEADER_INIT(5, (UINT)(ENTYPEDATA_STEP_3_D), ENTYPEDATA_STEP_HEADER_4_D)
}
m_test::~m_test(){
delete m_pBufs0;
delete m_pBufs5;
}
在 Microsoft Visual Studio C++ 版本 6 下,此文件编译时没有任何错误,但在 g++ 7.4.0 下,我的宏出现一些错误:
$g++ test_macro.cpp
test_macro.cpp:16:21: error: pasting "," and "ENTYPEDATA_STEP_HEADER_4_D" does not give a valid preprocessing token
sprintf(cTmpTb,"%d",##m);\
^
test_macro.cpp:51:5: note: in expansion of macro ‘SBUF_HEADER_INIT’
SBUF_HEADER_INIT(5, (UINT)(ENTYPEDATA_STEP_3_D), ENTYPEDATA_STEP_HEADER_4_D)
^~~~~~~~~~~~~~~~
如果不完全分离成一些简单的宏,我不明白如何修复它。 请帮忙。
更新: 宏
#define SBUF_HEADER_INIT(N, data, MD)\
sprintf(cTmpTb,"%d",MD);\
strcpy(cTmpTf,"%");\
strcat(cTmpTf,cTmpTb);\
strcat(cTmpTf,"d");\
sprintf(TmpHeaderBuf,cTmpTf,data);\
strcpy(this->m_pBufs##N,TmpHeaderBuf);
完美运行
【问题讨论】:
标签: c++ g++ preprocessor