Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 静态常量字符*-已定义但未使用_C++_Qt - Fatal编程技术网

C++ 静态常量字符*-已定义但未使用

C++ 静态常量字符*-已定义但未使用,c++,qt,C++,Qt,我们需要在每个头文件(.h)和源文件(.cpp)中定义一个const static char指针,以符合公司编码标准 static const char * one_time_param = "ABCDEFG"; 编译时,编译器会生成大量“已定义但未使用”的警告。请问有人能解决这个问题吗 -Wno-unused-parameter 使用上面的编译器标志,我们可以抑制这些警告。但是,这也会抑制一些可能需要注意的其他未使用的参数。我们尝试了这些只适用于函数参数的解决方案 Q_UNUSED 在Q

我们需要在每个头文件(.h)和源文件(.cpp)中定义一个
const static char
指针,以符合公司编码标准

static const char * one_time_param = "ABCDEFG";
编译时,编译器会生成大量“已定义但未使用”的警告。请问有人能解决这个问题吗

-Wno-unused-parameter
使用上面的编译器标志,我们可以抑制这些警告。但是,这也会抑制一些可能需要注意的其他未使用的参数。我们尝试了这些只适用于函数参数的解决方案

Q_UNUSED
在Qt中,以及

#define UNUSED(x) ((void)(x))
先前的同类问题:


看一看。

你随时可以绕过它。e、 g.
if(一次参数[0]==一次参数[0])
最小的计算工作量,它应该删除警告。这一行可能会被优化为无操作,因为它对程序本身毫无用处


这取决于您希望解决方案的优雅程度。也许有人可以推荐一个编译器标志来消除警告。

检查可执行文件的外部实用程序是否会引用该变量,或者它只是源代码中必须有的东西

如果您只需将其保存在源代码中,而不必将其保存在已编译的可执行文件中,为什么不
#如果
将其保存下来:

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

此方法的附加好处是,您不再需要担心头文件中的名称冲突。

在单个头文件中定义此方法,在头文件中定义单个内联函数以“获取”指针的值,然后在需要定义的地方包含此标题。

在项目的全局标题中声明一个宏,如:

#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");
似乎有效。不管人们怎么想宏和标记粘贴,至少有了宏,你就能找到这些东西,当人们意识到它们很愚蠢时,就把它们扔掉

一次参数h

#ifndef ONE_TIME_PARAM_H
#define ONE_TIME_PARAM_H

extern const char* one_time_param;

#endif
一次性参数cpp

#include "one_time_param.h"

const char* one_time_param = "ABCDEFG";
然后在每个头文件和源文件中包含一个_time_param.h


如果您首先需要
静态

的话,这当然行不通——公司的编码标准无疑是在浪费空间。如果要执行此操作,请使用数组而不是
char*
,以便只存储数据,而不是指针和数据:

static const char one_time_param[] = "ABCDEFG";
接下来,大概这是为了文件识别——至少,这是我使用它的目的。有几件事需要注意,是从多年的经验中学到的。(我仍然喜欢在源文件中嵌入版本号——因为这个原因,我还没有全心全意地迁移到DVCS。)

  • 要避免出现警告,必须使符号在文件外部可见
  • 这反过来意味着您必须使变量名唯一
  • 我目前正在使用基于文件名的名称:
    jlss\u id\u filename\u 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 */
    
  • AT&T SVR4 C编译器和支持软件支持
    #ident
    指令:

    #ident "@(#)$Id: errno.c,v 3.3 2011/09/07 22:33:45 jleffler Exp $"
    
    编译器在目标文件的“注释”部分包含字符串,并使用工具(
    mcs
    )操作注释部分(选项
    -d
    删除注释部分,选项
    -c
    压缩注释部分,IIRC)。此部分是二进制文件的一部分,但在运行时未加载到内存中

  • 在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 */
    
    然而,这些天我通常会删除声明,并且不会收到编译器警告

  • 作为使用文件名作为变量名基础的替代方法,您可以生成十六进制的UUID或GUID名称,并将其用作变量名,并使用前缀确保第一个字符是字母

  • 在头文件中,您不希望在包含头文件的每个源文件中都定义该材料,因为(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); 
    }
    

    当我运行
    what al
    时,我没有得到标识输出。

    在这种情况下,通常也是常量指针, 因此,尝试使用:

    static const char * const one_time_param = "ABCDEFG";
    

    哇,这是一个糟糕的编码标准。那根绳子是用来干什么的?它的毛病其实不是没用的。您可以使用svn
    Id
    标记和
    ident
    程序来确定程序中包含的文件的版本。嗯,你也可以在那里存储一些版权或其他东西。这是非常常见的做法。我的意思是比较是无用的,而不是字符串本身。比较只是说“如果是真的,什么也不做。”哦,是的。但我认为比较的问题是,你必须把它放在全球范围内。可能实现,但与显式地将此标记为“已使用”相比,代码太多。它还会在某些编译器上导致“与自身比较”警告。还有其他人说的“你真的是指这里吗?”,这很公平。我在gcc 4.2.1上进行了测试,效果很好,但正如我在回答中所说的:我确信有一个更优雅的解决方案。谢谢你的提示,但是,我们用它来注释大部分内容。这对我来说也很有效。通过将指针声明为const,您具体实现了什么?这在gcc 2.95(古代c编译器的金标准)上对我很有效。这也对我很有效,使我不必为常量.h创建源文件。我真的很高兴找到了这个答案。到底是哪一部分的答案
    static const char * const one_time_param = "ABCDEFG";