我有一个遗留代码,其中定义了一个宏
#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 zdigit:
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!
。因此,不幸的是,您的旧遗留代码似乎充满了潜在的错误。