考虑以下计划:
#include <iostream>
#define add(s,m,a) ( s + m + a + 0 )
int main()
{
std::cout<<add(3,4,5)<<'\n';
std::cout<<add(15,30,)<<'\n';
std::cout<<add(10, , 33)<<'\n';
std::cout<<add(10,,)<<'\n';
std::cout<<add(,,)<<'\n';
}
我的编译器gcc 4.8.1给出以下警告:
6 23 [Warning] invoking macro add argument 3: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]
7 25 [Warning] invoking macro add argument 2: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]
8 21 [Warning] invoking macro add argument 2: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]
8 21 [Warning] invoking macro add argument 3: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]
9 19 [Warning] invoking macro add argument 1: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]
9 19 [Warning] invoking macro add argument 2: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]
9 19 [Warning] invoking macro add argument 3: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]
我知道C不支持空的预处理器函数宏参数.但是C99允许使用空(缺失)参数指定预处理器函数宏.
(在上述情况下,许多C编译器可能会提供此功能作为扩展).程序的行为确实是根据C89& C标准?
解决方法:
C89 / C90和C 98标准根本没有定义应该如何处理空宏参数.结果,遗漏未定义行为,并且预处理时间警告或错误消息是合理的结果.
正如你所说,C99是第一个允许它的C标准,但值得一提的是C 11采用了C99的措辞.所以不,在C中不再有未定义的行为有空的宏参数.
标签:c-3,c98,c,macros,c89 来源: https://codeday.me/bug/20190724/1526600.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。