我们需要const static char在每个标头(.h)和源(.cpp)文件中定义一个指针,以符合公司编码标准.
static const char * one_time_param = "ABCDEFG";
Run Code Online (Sandbox Code Playgroud)
编译时,编译器会生成大量"已定义但未使用"的警告.请问有人有解决这个问题的方法吗?
-Wno-unused-parameter
Run Code Online (Sandbox Code Playgroud)
使用上面的编译器标志,我们可以抑制这些警告.但是,这也抑制了一些可能需要注意的其他未使用的参数.我们尝试了这些仅适用于功能参数的解决方案.
Q_UNUSED
Run Code Online (Sandbox Code Playgroud)
在Qt,和
#define UNUSED(x) ((void)(x))
Run Code Online (Sandbox Code Playgroud)
以前的类似问题:
kel*_*viN 19
在这种情况下它通常也是const指针,所以尝试使用:
static const char * const one_time_param = "ABCDEFG";
Run Code Online (Sandbox Code Playgroud)
Jon*_*ler 12
首先 - 公司编码标准可以说是浪费空间.如果您要这样做,那么使用数组而不是a,char *这样您只存储数据而不是指针和数据:
static const char one_time_param[] = "ABCDEFG";
Run Code Online (Sandbox Code Playgroud)
接下来,大概这是用于文件识别 - 至少,这是我使用它.有许多事情需要注意,从多年的经验中吸取教训.(我仍然希望在源文件中嵌入版本号 - 由于这个原因,我没有全心全意地转移到DVCS.)
我目前正在使用基于文件名的名称: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 */
Run Code Online (Sandbox Code Playgroud)AT&T SVR4 C编译器和支持软件支持一个#ident指令:
#ident "@(#)$Id: errno.c,v 3.3 2011/09/07 22:33:45 jleffler Exp $"
Run Code Online (Sandbox Code Playgroud)
编译器在对象文件的"注释"部分中包含字符串,并使用工具(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 */
Run Code Online (Sandbox Code Playgroud)
但是,我这些天通常会删除声明,并且不会收到编译器警告.
作为使用文件名作为变量名称基础的替代方法,您可以生成十六进制的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
Run Code Online (Sandbox Code Playgroud)
然后,当我想要标题定义值时,我#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
Run Code Online (Sandbox Code Playgroud)这是一个完整的(非常有用的)程序,说明了旧式的业务.
/*
@(#)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);
}
Run Code Online (Sandbox Code Playgroud)
注意:编译时,版本字符串不包含在二进制文件(或目标文件)中.当使用在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
Run Code Online (Sandbox Code Playgroud)
当我跑步时what al,我没有识别输出.