c - C中的多个宏

标签 c

#define a 10
#define a 20
{

    printf("%d",a);
}

为什么答案是 20 而不是 10?
因为/* #define a 10 */是第一个宏,难道不应该用它来代替'a'吗?

最佳答案

您的问题的前提(应该使用第一个定义)是错误的。

您的编译器已决定使用第二个定义。它真的可以随心所欲,因为您的程序格式错误/损坏/错误:

[C99: 6.10.3/2]: An identifier currently defined as an object-like macro shall not be redefined by another #define preprocessing directive unless the second definition is an object-like macro definition and the two replacement lists are identical. [..]



在这里,在 the documentation ,我们看到明确定义了 GCC 的非标准行为:

If a macro is redefined with a definition that is not effectively the same as the old one, the preprocessor issues a warning and changes the macro to use the new definition. If the new definition is effectively the same, the redefinition is silently ignored. This allows, for instance, two different headers to define a common macro. The preprocessor will only complain if the definitions do not match.



简而言之:不要这样做。

关于c - C中的多个宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42695880/

相关文章:

php-fpm7.1 mmap/munmap(非常)在虚拟化系统(大页面)上的性能很慢

c - 如何使objdump -D仅在Windows中显示特定功能?

c - linux fcntl文件锁定超时

c - 如何将min转换为函数

c - 为什么在 if 语句中未定义的行为是正确的?

c - 在 MPLab X IDE 上设置 Harmony Configurator 的 TCP IP 堆栈

c - C 中的命名共享内存问题

c - 从结构内的指针数组访问指针会导致段错误

c - 在C中创建字符串的不同方法

c - 使用预处理器定义的可选查找表