簡體   English   中英

Visual C ++與gcc / clang的不同行為,同時對包含逗號的參數進行字符串化

[英]Different behavior in visual c++ versus gcc/clang while stringifying parameter which contains comma

我正在使用字符串運算符將可能包含傳遞給宏的逗號的參數轉換為字符串。 據我所知,某些字符無法進行字符串化-特別是逗號(,),因為它用於定界參數,而右括號()),因為它標記了參數的結尾。 因此,我使用可變參數宏將逗號傳遞給字符串運算符,如下所示:

#include <stdio.h>

#define TEST 10, 20

#define MAKE_STRING(...)  #__VA_ARGS__
#define STRING(x)       MAKE_STRING(x)

int main()
{
    printf("%s\n", STRING(TEST) );
    return 0;
}

它工作正常。 但是它發生在我身上,如果沒有可變參數宏,將會發生什么事情,所以我修改了宏: #define MAKE_STRING(x) #x 它在Visual c ++ 2008/2010中意外編譯良好,並輸出10, 20而gcc / clang給出了預期的編譯錯誤:

宏“ MAKE_STRING”傳遞了2個參數,但只接受了1個

所以我的問題是:Visual c ++是在做其他工作還是行為未定義?

VS通常允許在宏中添加額外的參數,然后將其靜默刪除: STRING(10, 20, 30) -仍然有效並打印10 這里不是這種情況,但這在很大程度上意味着VS甚至沒有向您拋出gcc錯誤。

這不是任何額外的工作,而是“僅”替換順序上的差異。

我不確定這是否能回答您的問題,但我希望這會幫助您解決問題。 在C中定義字符串常量時,應在雙引號中將其包括(用於空格)。 同樣, #宏將變量名用雙引號引起來,例如, #a變為"a"

#include <stdio.h>

#define TEST "hello, world"
#define MAKE_STRING(x) #x

int main()
{
    int a;
    printf("%s\n", TEST);
    printf("%s\n", MAKE_STRING(a));
    return 0;
}

我使用gcc 4.7.1編譯了此代碼,輸出為:

hello, world
a

我不知道為什么這會投票贊成,或者答案被投票反對(所以海報將其刪除了),但我不知道您期望什么!

#__VA_ARGS__沒有任何意義,假設我有MACRO(a,b,c)您想要“ a,b,c”作為字符串嗎?

http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html#Variadic-Macros

讀取(已成為標准行為)后,宏中的可變長度參數允許它們在函數的可變長度參數中進行操作。 預處理器對文本進行操作!

涉及#的唯一特殊情況是##,如果沒有多余的參數,它將刪除##之前的逗號(從而防止語法錯誤)

注意:

閱讀MACRO(a,b,c)部分非常重要MACRO(a,b,c)您期望字符串“ a,b,c”是什么呢? 或“ a,b,c”(如果您想要字符串“ a,b,c”)寫字符串“ a,b,c”

使用#運算符非常適合諸如

#define REGISTER_THING(THING) core_of_program.register_thing(THING); printf("%s registered\n",#THING);

暫無
暫無

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

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