簡體   English   中英

static const char * - 已定義但未使用

[英]static const char * - defined but not used

我們需要在每個頭(.h)和源(.cpp)文件中定義一個const static char指針,以符合公司編碼標准。

static const char * one_time_param = "ABCDEFG";

編譯時,編譯器會生成大量“已定義但未使用”的警告。 請問有人有解決這個問題的方法嗎?

-Wno-unused-parameter

使用上面的編譯器標志,我們可以抑制這些警告。 但是,這也抑制了一些可能需要注意的其他未使用的參數。 我們嘗試了這些僅適用於功能參數的解決方案。

Q_UNUSED

在Qt,和

#define UNUSED(x) ((void)(x))

以前的類似問題:

如何在GCC中隱藏“已定義但未使用”的警告?

在這種情況下它通常也是const指針,所以嘗試使用:

static const char * const one_time_param = "ABCDEFG";

首先 - 公司編碼標准可以說是浪費空間。 如果您要這樣做,那么使用數組而不是char *因此您只存儲數據而不是指針和數據:

static const char one_time_param[] = "ABCDEFG";

接下來,大概這是用於文件識別 - 至少,這是我使用它。 有許多事情需要注意,從多年的經驗中吸取教訓。 (我仍然希望在源文件中嵌入版本號 - 因此我沒有全心全意地轉移到DVCS。)

  1. 要避免警告,您必須在文件外部顯示符號。
  2. 反過來,這意味着您必須使變量名稱唯一。
  3. 我目前正在使用基於文件名的名稱: jlss_id_filename_c[]等。

     #ifndef lint /* Prevent over-aggressive optimizers from eliminating ID string */ const char jlss_id_errno_c[] = "@(#)$Id: errno.c,v 3.3 2011/09/07 22:33:45 jleffler Exp $"; #endif /* lint */ 
  4. AT&T SVR4 C編譯器和支持軟件支持#ident指令:

     #ident "@(#)$Id: errno.c,v 3.3 2011/09/07 22:33:45 jleffler Exp $" 

    編譯器將字符串包含在目標文件的“注釋”部分中,並使用工具( mcs )來操作注釋部分(選項-d將其刪除, -c將其壓縮,IIRC)。 此部分是二進制文件的一部分,但未在運行時加載到內存中。

  5. 在GCC演變的某一點上,結合我使用的命令行選項,除非我聲明定義變量,否則我會收到警告,因此新源文件的'模板'會生成:

     #ifndef lint /* Prevent over-aggressive optimizers from eliminating ID string */ extern const char jlss_id_filename_c[]; const char jlss_id_filename_c[] = "@(#)$Id$"; #endif /* lint */ 

    但是,我這些天通常會刪除聲明,並且不會收到編譯器警告。

  6. 作為使用文件名作為變量名稱基礎的替代方法,您可以生成十六進制的UUID或GUID名稱並將其用作變量名稱,並使用前綴以確保第一個字符是字母。

  7. 在標題中,您不希望在包含標題的每個源文件中定義該材料,因為(a)它成為程序大小的顯着(但不一定是重要的)開銷,並且(b)您不能多次定義全局變量(你可以多次聲明它們;這不是問題)。 所以,我的標題有一個像:

     #ifdef MAIN_PROGRAM #ifndef lint /* Prevent over-aggressive optimizers from eliminating ID string */ const char jlss_id_stderr_h[] = "@(#)$Id: stderr.h,v 10.3 2011/11/28 04:49:24 jleffler Exp $"; #endif /* lint */ #endif 

    然后,當我想要標題來定義值時,我在相應的源文件的頂部有#define MAIN_PROGRAM 例如,通過在該名稱的程序上運行what errno ,我得到輸出:

     errno: $Id: errno.c,v 3.3 2011/09/07 22:33:45 jleffler Exp $ $Id: range.h,v 1.8 2008/02/11 07:39:36 jleffler Exp $ $Id: stderr.h,v 10.3 2011/11/28 04:49:24 jleffler Exp $ $Id: errhelp.c,v 8.5 2009/03/02 19:13:51 jleffler Exp $ $Id: range2.c,v 1.8 2008/02/11 08:44:50 jleffler Exp $ $Id: stderr.c,v 10.7 2011/11/28 04:49:24 jleffler Exp $ stderr.c configured with USE_STDERR_FILEDESC stderr.c configured with USE_STDERR_SYSLOG 

老式

這是一個完整的(非常有用的)程序,說明了舊式的業務。

/*
@(#)File:            $RCSfile: al.c,v $
@(#)Version:         $Revision: 1.4 $
@(#)Last changed:    $Date: 1996/08/13 11:14:15 $
@(#)Purpose:         List arguments one per line
@(#)Author:          J Leffler
@(#)Copyright:       (C) JLSS 1992,1996
@(#)Product:         :PRODUCT:
*/

/*TABSTOP=4*/

#include <stdio.h>
#include <stdlib.h>

#ifndef lint
static const char sccs[] = "@(#)$Id: al.c,v 1.4 1996/08/13 11:14:15 johnl Exp $";
#endif

int main(int argc, char **argv)  
{ 
    while (*++argv) 
        puts(*argv);
    return(EXIT_SUCCESS); 
}

注意:編譯時,版本字符串不包含在二進制文件(或目標文件)中。 當使用在MacOS X 10.7.2上編譯的GCC 4.6.1編譯時,這當前不會給我任何警告:

gcc -m64 -g -O -std=c99 -pedantic -Wall -Wshadow -Wpointer-arith -Wcast-qual \
    -Wstrict-prototypes -Wmissing-prototypes -o al al.c

當我運行what al ,我沒有識別輸出。

看一下__attribute__((used))

變量是否會被檢查可執行文件的某個外部實用程序引用,或者它只是源中必須具有的內容?

如果你必須在源代碼中擁有它,並且它不必在編譯的可執行文件中,為什么不#if it out:

#if 0
static const char * one_time_param = "ABCDEFG";
#endif

此方法的額外好處是您不再需要擔心頭文件中的名稱沖突。

你總是可以破解它。 例如if (one_time_param[0] == one_time_param[0]); 最小的計算工作量,它應該刪除警告。 該行可能會針對無操作進行優化,因為它對程序本身無用。

這取決於您希望解決方案的優雅程度。 也許有人可以推薦一個能夠擺脫警告的編譯器標志。

在單個標頭中定義它,在標頭內定義一個內聯函數以“獲取”指針的值,然后在需要定義的任何位置包含此標頭。

在項目的全局標題中聲明一個宏,如:

#define DECLARE_ONETIME_CONST(name,value) \
    static const char* name = (value); \
    static const char nowarning_##name = name[0];

然后在你的文件中說:

DECLARE_ONETIME_CONST(one_time_param, "ABCDEFG");

似乎工作。 無論人們如何看待宏和令牌粘貼,至少有一個宏,你將能夠找到這些東西,並在人們意識到它們是愚蠢的時候擺脫它們。 <聳肩>

one_time_param.h

#ifndef ONE_TIME_PARAM_H
#define ONE_TIME_PARAM_H

extern const char* one_time_param;

#endif

one_time_param.cpp

#include "one_time_param.h"

const char* one_time_param = "ABCDEFG";

然后在每個頭文件和源文件中包含one_time_param.h。

< scratchhes head >如果你需要它是static這當然是行不通的。

暫無
暫無

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

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