应为表达式错误 我有C++代码并在代码上运行PC LIt。
问题1:应为表达式错误 我有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
#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
),该符号在