91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

編譯器檢查函數聲明和函數實際調用參數之間的格式化字符串是否匹配

發布時間:2020-08-11 01:18:12 來源:網絡 閱讀:562 作者:qdqade 欄目:編程語言

背景

在輸出日志時 被 RUNLOG_DEBUG("%s,%d", para_int, para_str.c_str()) 坑過, 才知道 能校驗 格式化字符串和 字段本身是否匹配 的重要性;

參考文獻:https://www.cnblogs.com/marvin-notes/p/4482805.html 感謝原作者

方法

attribute format 該屬性 可以給被聲明的 函數 加上 類似 printf /scanf 的特征, 能用于 編譯器檢查 函數聲明和時間調用參數直接的 格式化字符串是否 匹配; GNU CC需要使用 –Wall 才能使用

語法: format (archetype, string-index, first-to-check)

archetype :  printf, scanf, strftime或strfmon,  表示按照那種風格進行檢查
string-index: 傳入參數的第幾個參數是格式化字符串, 就是 "%s,%d" 的下標(從1 開始)
first-to-check: 指定從 函數的 第幾個參數開始 校驗

實例:

__attribute__((format(printf,m,n)))

m:第幾個參數為格式化字符串(format string)
n:參數集合中的第一個,即參數“…”里的第一個參數在函數參數總數排在第幾.這里需要注意,有時函數參數里還有“隱身”的,如C++的類成員函數的第一個參數實際上是"隱身"的"this"指針;

代碼實例

#include <stdarg.h>
#include <string>
#include <stdio.h>

using namespace std;

#define mm_p(fmt, args...) myprint(fmt, args)
void myprint(const char *fmt,...)  __attribute__((format(printf,1,2)));
void myprint(const char *fmt,...)
{
    va_list ap; 
    va_start(ap, fmt);
    vprintf(fmt,ap);
    va_end(ap);
}

struct ss
{
public:
    void pri(const char* fmt, ...) __attribute__((format(printf,2,3)))
    {   
    }   
};
int main()
{

    mm_p("dfjkaj[%d][%s]\n",123,456);
    myprint("dfjkaj[%d][%d]\n",123,456);

    ss s;
    s.pri("%s[%s", "dd",456);
}
g++ -Wall test_var.cpp -o test_var
test_var.cpp: In function 'int main()':
test_var.cpp:27: warning: format '%s' expects type 'char*', but argument 3 has type 'int'
test_var.cpp:31: warning: format '%s' expects type 'char*', but argument 4 has type 'int'
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

罗田县| 沅江市| 宁蒗| 义乌市| 宜丰县| 上饶县| 临湘市| 扬中市| 新田县| 舞钢市| 临桂县| 旺苍县| 新绛县| 邹平县| 柏乡县| 龙岩市| 焦作市| 确山县| 达州市| 大新县| 平罗县| 沁源县| 黄浦区| 南通市| 塘沽区| 宕昌县| 平昌县| 桃江县| 历史| 油尖旺区| 大关县| 福清市| 牟定县| 宁化县| 兰州市| 南木林县| 沁阳市| 五家渠市| 六安市| 阳山县| 广西|