c语言 - 错误 c2008:".":在 Visual Studio 中的宏定义中出现意外



我有一个遗留代码,其中定义了一个宏

#ifndef RTW_HEADER_Export_gain.ads_h_

VS2019报告错误

error c2008: '.': unexpected in macro definition

根据C标准,MINGW可以编译相同的代码。是否有一个选项来放松visual studio将如何管理宏名称?

根据C标准,标识符RTW_HEADER_Export_gain.ads_h_无效

标识符

标识符是由数字、下划线、小写和大写拉丁字母以及使用u和u转义符号指定的Unicode字符组成的任意长的序列(自C99起)。有效的标识符必须以非数字字符(拉丁字母、下划线或Unicode非数字字符(自C99起))开头。标识符是区分大小写的(小写字母和大写字母是不同的)。

简而言之,标识符不能包含操作符。看下面的例子,你认为这是什么?

my_obj.value

根据C标准,MINGW可以编译相同的代码。

这是无稽之谈。当你不知道自己在说什么的时候,不要去说这样的话。引用标准

形式语法实际上是这样说的(C17 6.10):

# ifndef标识符新行<子>选择

在第6.4.2章中指定的标识符只包含下面引用的符号:

数字:
_之一b e c d f g h i j k l m n o p q r s t u v w x y z
a b c d e f g h i j k l m n o p q r s t u v w x y z

digit:
0 1 2 3 4 5 6 7 8 9

/——/

标识符是由非数字字符(包括下划线_、小写和大写拉丁字母以及其他字符)和数字组成的序列,…


现在,它编译的原因是;在gcc/mingw中是因为它默认使用lax非标准模式。它仍然不能编译干净,您忽略了这些警告:

警告:宏名称后缺少空白警告:#ifndef指令

末尾有额外的标记

编译带有警告并不意味着某些东西是有效的C。参见C编译器在发现错误时必须做什么?如果您希望在编译无效的C时得到错误,您应该使用gcc -std=c17 -pedantic-errors(或-std=c11对于旧的Mingw)。

那么,当你使用宽松设置编译时,你的代码实际上做了什么?在标识符中使用.不是我所知道的gcc非标准扩展。#ifndef显然只检查RTW_HEADER_Export_gain部分。试试这个:

#define RTW_HEADER_Export_gain.bananas
#ifdef RTW_HEADER_Export_gain.ads_h_
puts("RTW_HEADER_Export_gain.ads_h_ is definitely defined!");
#endif 

当我在gcc/mingw上运行它时,打印RTW_HEADER_Export_gain.ads_h_ is definitely defined!。因此,不幸的是,您的旧遗留代码似乎充满了潜在的错误。

最新更新