Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.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++代码并在代码上运行PC LIt。_C++_Lint - Fatal编程技术网

应为表达式错误 我有C++代码并在代码上运行PC LIt。

应为表达式错误 我有C++代码并在代码上运行PC LIt。,c++,lint,C++,Lint,问题1: #if !WIN32 #define ULONG_MAX 0xffffffff #endif 上面的代码抛出一个lint错误,如下所示 错误26:应为表达式,找到“WIN32” 错误30:应为整数常量 如何修复上述错误 问题2: const char CompanyName[] = "mycompany"; 错误:注意960:违反MISRA要求的规则8.5,头文件中没有对象/函数定义 如何修复上述错误 问题3: unsigned long m_ClientThreadId; m

问题1:

#if !WIN32
#define ULONG_MAX 0xffffffff
#endif
上面的代码抛出一个lint错误,如下所示

错误26:应为表达式,找到“WIN32”
错误30:应为整数常量

如何修复上述错误

问题2:

const char CompanyName[] = "mycompany"; 
错误:注意960:违反MISRA要求的规则8.5,头文件中没有对象/函数定义

如何修复上述错误

问题3:

unsigned long m_ClientThreadId; 
m_ClientThreadId        = 0;
注960:违反MISRA要求的规则10.1,隐式转换更改签名


如何修复上述错误?

首先:

unsigned long m_ClientThreadId; 
m_ClientThreadId        = 0;
#if !WIN32
#define ULONG_MAX 0xffffffff
#endif
const char CompanyName[] = "mycompany";
unsigned long m_ClientThreadId; 
m_ClientThreadId        = 0;
您需要这样做:

#ifndef WIN32
#define ULONG_MAX 0xffffffff
#endif
秒:

unsigned long m_ClientThreadId; 
m_ClientThreadId        = 0;
#if !WIN32
#define ULONG_MAX 0xffffffff
#endif
const char CompanyName[] = "mycompany";
unsigned long m_ClientThreadId; 
m_ClientThreadId        = 0;
不能在头文件中定义,否则相同的符号将出现在多个编译单元中

您需要做的只是在标题中声明:

extern const char CompanyName[];
然后在其中一个模块中定义一次:

const char CompanyName[] = "mycompany"; 
第三名:

unsigned long m_ClientThreadId; 
m_ClientThreadId        = 0;
#if !WIN32
#define ULONG_MAX 0xffffffff
#endif
const char CompanyName[] = "mycompany";
unsigned long m_ClientThreadId; 
m_ClientThreadId        = 0;

这是不寻常的,但似乎
0
是一个有符号常量。将其分配给
unsigned long
具有隐式类型转换。大多数编译器实际上不会对此发出警告。

首先:

unsigned long m_ClientThreadId; 
m_ClientThreadId        = 0;
#if !WIN32
#define ULONG_MAX 0xffffffff
#endif
const char CompanyName[] = "mycompany";
unsigned long m_ClientThreadId; 
m_ClientThreadId        = 0;
您需要这样做:

#ifndef WIN32
#define ULONG_MAX 0xffffffff
#endif
秒:

unsigned long m_ClientThreadId; 
m_ClientThreadId        = 0;
#if !WIN32
#define ULONG_MAX 0xffffffff
#endif
const char CompanyName[] = "mycompany";
unsigned long m_ClientThreadId; 
m_ClientThreadId        = 0;
不能在头文件中定义,否则相同的符号将出现在多个编译单元中

您需要做的只是在标题中声明:

extern const char CompanyName[];
然后在其中一个模块中定义一次:

const char CompanyName[] = "mycompany"; 
第三名:

unsigned long m_ClientThreadId; 
m_ClientThreadId        = 0;
#if !WIN32
#define ULONG_MAX 0xffffffff
#endif
const char CompanyName[] = "mycompany";
unsigned long m_ClientThreadId; 
m_ClientThreadId        = 0;

这是不寻常的,但似乎
0
是一个有符号常量。将其分配给
unsigned long
具有隐式类型转换。大多数编译器实际上不会对此发出警告。

对于第二个问题,该行是否在头文件中?通常,您不应该在标题中定义变量,尤其是如果该标题包含在多个文件中,因为这将创建同一变量的两个副本,并导致链接错误。

对于问题二,该行是否在标题文件中?通常,您不应该在标题中定义变量,尤其是如果该标题包含在多个文件中,因为这将创建同一变量的两个副本并导致链接错误。

对于第一个问题,我想您应该使用

#ifndef WIN32
而不是

#if !WIN32

由于WIN32宏并不总是存在,您需要检查它的存在性,而不是它的“错误性”。

对于第一个问题,我想您应该使用

#ifndef WIN32
而不是

#if !WIN32

由于WIN32宏并不总是存在,您需要检查它的存在性,而不是它的“错误性”。

还有
\if!已定义(WIN32)
,但如果WIN32的定义更容易理解。

还有
\if!定义(Win32),但<>代码> IFNDEF Win32 < /C>比较容易理解。

< P>没有一个报告错误是C++错误;这是风格问题


第一名:

unsigned long m_ClientThreadId; 
m_ClientThreadId        = 0;
#if !WIN32
#define ULONG_MAX 0xffffffff
#endif
const char CompanyName[] = "mycompany";
unsigned long m_ClientThreadId; 
m_ClientThreadId        = 0;
这是合法的。在
#if
指令中,任何未定义的标记都将替换为
0
。但是,正如其他人已经建议的那样,编写WIN32
ifndef可能是更好的风格

但事实上,这整件事可能是个坏主意<代码> ULUGOXMAX是在C标准标题“代码> <代码>中定义的宏,以及C++标准头标题<代码> <代码>。将上述3条线路替换为:

#include <climits>
合法,但这是个坏主意。如果头文件是来自不同翻译单元的
#include
d,则将有多个
CompanyName
定义。(我不太清楚C++规则是怎么说的)看看Mysticial的回答。< /P> 第三名:

unsigned long m_ClientThreadId; 
m_ClientThreadId        = 0;
#if !WIN32
#define ULONG_MAX 0xffffffff
#endif
const char CompanyName[] = "mycompany";
unsigned long m_ClientThreadId; 
m_ClientThreadId        = 0;
在这里,PC lint过于挑剔。是的,将
0
(类型为
int
)隐式转换为
unsigned long
确实会更改签名,但在这种情况下不会导致任何可能的问题。但您可以使用unsigned long类型的文本来避免警告:

unsigned long m_ClientThreadId; 
m_ClientThreadId        = 0UL;

P>这些错误都没有出现C++错误;这是风格问题


第一名:

unsigned long m_ClientThreadId; 
m_ClientThreadId        = 0;
#if !WIN32
#define ULONG_MAX 0xffffffff
#endif
const char CompanyName[] = "mycompany";
unsigned long m_ClientThreadId; 
m_ClientThreadId        = 0;
这是合法的。在
#if
指令中,任何未定义的标记都将替换为
0
。但是,正如其他人已经建议的那样,编写WIN32ifndef可能是更好的风格

但事实上,这整件事可能是个坏主意<代码> ULUGOXMAX是在C标准标题“代码> <代码>中定义的宏,以及C++标准头标题<代码> <代码>。将上述3条线路替换为:

#include <climits>
合法,但这是个坏主意。如果头文件是来自不同翻译单元的
#include
d,则将有多个
CompanyName
定义。(我不太清楚C++规则是怎么说的)看看Mysticial的回答。< /P> 第三名:

unsigned long m_ClientThreadId; 
m_ClientThreadId        = 0;
#if !WIN32
#define ULONG_MAX 0xffffffff
#endif
const char CompanyName[] = "mycompany";
unsigned long m_ClientThreadId; 
m_ClientThreadId        = 0;
在这里,PC lint过于挑剔。是的,将
0
(类型为
int
)隐式转换为
unsigned long
确实会更改签名,但在这种情况下不会导致任何可能的问题。但您可以使用unsigned long类型的文本来避免警告:

unsigned long m_ClientThreadId; 
m_ClientThreadId        = 0UL;

有几点需要澄清。例如,行:

#if !WIN32
实际上,标准对其进行了很好的定义,并且可以合理使用 如果编译器调用始终包含
/DWIN32=1
-DWIN32=0
。 因此,标准规定,未定义的符号是 在宏扩展期间被
0
替换,因此不会出现任何问题 除非其他公约规定符号 将仅在Windows计算机上定义,但定义为 未指定;在这种情况下,您需要以下内容:

#ifndef WIN32
最后,这取决于你为之建立的惯例 处理编译器依赖项

另一方面,应避免紧跟其后的路线, 因为它定义了一个符号(
ULONG_MAX
),该符号在