标签: c-preprocessor

#include <filename>和#include"filename"有什么区别?

在C和C++编程语言中,使用尖括号和在include语句中使用引号有什么区别,如下所示?

  1. #include <filename>
  2. #include "filename"

c c++ include header-files c-preprocessor

2204
推荐指数
27
解决办法
55万
查看次数

为什么C预处理器将单词"linux"解释为常量"1"?

为什么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 linux gcc c-preprocessor

995
推荐指数
5
解决办法
11万
查看次数

为什么在宏中使用明显无意义的do-while和if-else语句?

在许多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)

c c++ c++-faq c-preprocessor

758
推荐指数
8
解决办法
9万
查看次数

为什么在C++头文件中使用#ifndef和#define?

我一直在头文件的开头看到这样的代码:

#ifndef HEADERFILE_H
#define HEADERFILE_H
Run Code Online (Sandbox Code Playgroud)

并在文件的最后是

#endif
Run Code Online (Sandbox Code Playgroud)

这样做的目的是什么?

c c++ c-preprocessor

458
推荐指数
4
解决办法
39万
查看次数

为什么我的讲师写的所有C文件都以#开头?

为什么我的讲师写的所有C文件都以#开头?

我正在阅读一些C课程笔记,每个 C程序源文件都以程序#第一行的单个文件开头.

然后有空格,然后是其他东西后跟main函数.

是什么原因#

(现在这是不合时宜的,我不能真的问这个小伙子.)

这是一个例子(在结束时有一个额外的行#)

#

#include <stdio.h>
int main() {
   printf("Hello, World!");
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

c c-preprocessor

424
推荐指数
1
解决办法
2万
查看次数

结合C++和C - #ifdef __cplusplus如何工作?

我正在开发一个包含大量遗留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和函数原型.我有几个问题,看看我是否理解正确:

  1. 如果我有一个C++文件A.hh,其中包含一个C头文件Bh,包含另一个C头文件Ch,这是如何工作的?我认为当编译器进入Bh时, __cplusplus将被定义,因此它将包装代码extern "C" (并且__cplusplus不会在此块内定义).因此,当它进入Ch时, __cplusplus将不会定义并且代码将不会被包装 extern "C".它是否正确?

  2. 包装一段代码有什么问题 extern "C" { extern "C" { .. } }吗?第二个会extern "C" 做什么?

  3. 我们不把这个包装器放在.c文件周围,只放在.h文件中.那么,如果函数没有原型会发生什么?编译器是否认为它是C++函数?

  4. 我们还使用了一些用C语言编写的第三方代码,并没有这种包装.每当我从该库中包含一个标题时,我就一直extern "C"在使用#include.这是处理这个问题的正确方法吗?

  5. 最后,这是一个好主意吗?还有什么我们应该做的吗?我们将在可预见的未来混合C和C++,我想确保我们覆盖所有基础.

c c++ c-preprocessor extern-c

293
推荐指数
4
解决办法
20万
查看次数

如何在C预处理器中可靠地检测Mac OS X,iOS,Linux,Windows?

如果有一些跨平台的C/C++代码应该在Mac OS X,iOS,Linux,Windows上编译,我如何在预处理器进程中可靠地检测它们?

c c++ cross-platform c-preprocessor os-detection

291
推荐指数
3
解决办法
14万
查看次数

C中的MIN和MAX

在C中的位置MINMAX定义,如果有的话?

实现这些的最佳方式是什么,尽可能通用和安全?(首选编译器扩展/内置主流编译器.)

c max min c-preprocessor

265
推荐指数
11
解决办法
67万
查看次数

通过cmake定义预处理器宏

如何通过cmake定义预处理器变量?

等效的代码是#define foo.

c++ cmake c-preprocessor

261
推荐指数
4
解决办法
18万
查看次数

GCC转储预处理器定义

有没有办法让gcc/g ++从命令行转储它的预处理器定义?我的意思是__GNUC__,__STDC__等等.

gcc g++ c-preprocessor

232
推荐指数
5
解决办法
11万
查看次数