gpt4 book ai didi

c++ - Microsoft C++和G++预处理程序行为差异

转载 作者:行者123 更新时间:2023-12-01 14:43:43 25 4
gpt4 key购买 nike

我有这样的测试程序:

#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++ ver 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)
^~~~~~~~~~~~~~~~

我不明白如何在不完全分离成一些简单宏的情况下修复它。
请帮忙。

UPD:

#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);

工作完美

最佳答案

GCC是正确的。

您只需要m

您正在尝试执行没有意义的 token 连接。

Visual Studio 6仍然允许它(与VS 2019一样)。从技术上讲,您的方法具有不确定的行为,因此任何结果实际上都是“正确的”,但是GCC才最有意义。注意Visual Studio's behaviour is undocumented,所以如果我被诱惑了,我什至不会依赖它。

关于c++ - Microsoft C++和G++预处理程序行为差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59568380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com