簡體   English   中英

Microsoft C++ 和 g++ 預處理器行為差異

[英]Microsoft C++ and g++ preprocessor behavior difference

我有這樣的測試程序:

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

我不明白如何在不完全分離成一些簡單的宏的情況下修復它。 請幫忙。

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

工作完美

海灣合作委員會是正確的。

你只想要m

您試圖在沒有意義的情況下執行令牌連接。

Visual Studio 6 無論如何都允許它(VS 2019 也是如此)。 從技術上講,您的方法具有未定義的行為,因此任何結果實際上都是“正確的”,但 GCC 最有意義。 請注意, Visual Studio 的行為未記錄在案,因此如果我受到誘惑,我什至不會在該環境中依賴它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM