在C和C++编程语言中,使用尖括号和在include语句中使用引号有什么区别,如下所示?
#include <filename> #include "filename"为什么GCC中的C预处理器将单词linux(小写字母)解释为常量1?
test.c的:
#include <stdio.h>
int main(void)
{       
    int linux = 5;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果$ gcc -E test.c(预处理阶段后停止):
....
int main(void)
{
    int 1 = 5;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
哪个 - 当然 - 会产生错误.
(顺便说一句:#define linuxstdio.h文件中没有.)
在许多C/C++宏中,我看到宏的代码包含在看似无意义的do while循环中.这是一些例子.
#define FOO(X) do { f(X); g(X); } while (0)
#define FOO(X) if (1) { f(X); g(X); } else
Run Code Online (Sandbox Code Playgroud)
我看不出它do while在做什么.为什么不在没有它的情况下写这个?
#define FOO(X) f(X); g(X)
Run Code Online (Sandbox Code Playgroud) 我一直在头文件的开头看到这样的代码:
#ifndef HEADERFILE_H
#define HEADERFILE_H
Run Code Online (Sandbox Code Playgroud)
并在文件的最后是
#endif
Run Code Online (Sandbox Code Playgroud)
这样做的目的是什么?
为什么我的讲师写的所有C文件都以#开头?
我正在阅读一些C课程笔记,每个 C程序源文件都以程序#第一行的单个文件开头.
然后有空格,然后是其他东西后跟main函数.
是什么原因#?
(现在这是不合时宜的,我不能真的问这个小伙子.)
这是一个例子(在结束时有一个额外的行#)
#
#include <stdio.h>
int main() {
   printf("Hello, World!");
   return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在开发一个包含大量遗留C代码的项目.我们已经开始用C++编写,目的是最终转换遗留代码.我对C和C++的交互方式有点困惑.我知道通过使用C++编译器包装C代码extern "C"不会破坏C代码的名称,但我不完全确定如何实现它.
因此,在每个C头文件的顶部(在包含警卫之后),我们有
#ifdef __cplusplus
extern "C" {
#endif
Run Code Online (Sandbox Code Playgroud)
在底部,我们写
#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)
在两者之间,我们拥有所有的includes,typedef和函数原型.我有几个问题,看看我是否理解正确:
如果我有一个C++文件A.hh,其中包含一个C头文件Bh,包含另一个C头文件Ch,这是如何工作的?我认为当编译器进入Bh时,
 __cplusplus将被定义,因此它将包装代码extern "C"
(并且__cplusplus不会在此块内定义).因此,当它进入Ch时,
 __cplusplus将不会定义并且代码将不会被包装
 extern "C".它是否正确?
包装一段代码有什么问题
 extern "C" { extern "C" { .. } }吗?第二个会extern "C"
做什么?
我们不把这个包装器放在.c文件周围,只放在.h文件中.那么,如果函数没有原型会发生什么?编译器是否认为它是C++函数?
我们还使用了一些用C语言编写的第三方代码,并没有这种包装.每当我从该库中包含一个标题时,我就一直extern "C"在使用#include.这是处理这个问题的正确方法吗?
最后,这是一个好主意吗?还有什么我们应该做的吗?我们将在可预见的未来混合C和C++,我想确保我们覆盖所有基础.
如果有一些跨平台的C/C++代码应该在Mac OS X,iOS,Linux,Windows上编译,我如何在预处理器进程中可靠地检测它们?
在C中的位置MIN和MAX定义,如果有的话?
实现这些的最佳方式是什么,尽可能通用和安全?(首选编译器扩展/内置主流编译器.)
有没有办法让gcc/g ++从命令行转储它的预处理器定义?我的意思是__GNUC__,__STDC__等等.
c-preprocessor ×10
c ×8
c++ ×6
gcc ×2
c++-faq ×1
cmake ×1
extern-c ×1
g++ ×1
header-files ×1
include ×1
linux ×1
max ×1
min ×1
os-detection ×1