编译和链接过程如何工作?
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
我正在尝试编写"The C Programming Language"(K&R)一书中的这段代码.它是UNIX程序的一个简单版本wc:
#include <stdio.h>
#define IN 1; /* inside a word */
#define OUT 0; /* outside a word */
/* count lines, words and characters in input */
main()
{
int c, nl, nw, nc, state;
state = OUT;
nl = nw = nc = 0;
while ((c = getchar()) != EOF) {
++nc;
if (c == '\n')
++nl;
if (c == ' ' || c == '\n' || c == '\t')
state = OUT; …Run Code Online (Sandbox Code Playgroud) 是否有一个选项,GCC预处理器可以生成C源代码并过滤掉不相关的源代码?
例如,一个.c文件有一个#define开关来定义许多不同的平台.我只对一个平台感兴趣,我希望C预处理器过滤掉不相关的代码.
GCC是否支持这一点?
我正在玩,gcc并尝试了以下一些代码:
int A = 42;
int *B = &A;
int *C = &*B;
Run Code Online (Sandbox Code Playgroud)
并且C == &A,正如所料.但是当我尝试:
int *B = NULL;
int *C = &*B;
Run Code Online (Sandbox Code Playgroud)
原来C == NULL,没有段错误.因此,在获取其地址之前&*B实际上并未解除引用B.
我的猜测是预处理器剥离出来的情况下,&*和*&之前,他们甚至得到了编译器,因为他们否定对方,但我无法找到任何文件,以验证这是否是标准ç或编译器特定的.
被预处理器剥离出来&*,并*&和我可以期待从任何给定的编译器这种行为?
我希望在我的代码上看到Visual C++预处理器的输出 - 即相当于gcc -E.对于我的生活,我找不到相关的编译器开关.我该如何做到这一点?
我在程序中定义了许多调试语句,我希望能够在没有这些语句的情况下复制源代码.
为了做到这一点,我首先看了GCC的-E命令行参数,它只运行预处理器,但这比我想要的要多得多,扩展包含的文件并添加#line语句.
例如:
#include <stdio.h>
#ifdef DEBUG
#define debug( s ) puts ( s );
#else
#define debug( s )
#endif
int main( int argc, char* argv[] )
{
debug( "Foo" )
puts( "Hello, World!" );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望将其处理为:
#include <stdio.h>
int main( int argc, char* argv[] )
{
puts( "Hello, World!" );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后我可以用astyle这样的东西来整理它,并且不需要手动工作来获得我想要的东西.
GCC是否缺少指令,或者是否有能够执行此操作的工具?
我有:
我需要:
一个工具(例如在线),它将简单地进行MACROS(或宏系统)的实例化并显示结果代码.
例:
输入:
#define AAA(a,b) if ((a) > (b))
AAA(1, f1(10))
Run Code Online (Sandbox Code Playgroud)
输出:
if ((1) > (f1(10)))
Run Code Online (Sandbox Code Playgroud) 如何找出编译器花费时间的位置?
我的构建速度太慢,我已经在使用RAMdisk作为VC++临时文件,它没有任何区别.(我有一个SSD,所以我预计没有区别.)
这个项目中的大多数单个C++文件都需要大约.编译2秒似乎很糟糕(因为我也没有任何项目内并行化,因为我使用的是VS2005).
我该如何优化呢?不进行分析就不优化,但如何分析编译器?
注意:这些并不是真的有用:
让我们添加一个好评:你有很多模板吗?你的文件平均有多大?你检查过,只包括最少的必要标题
不,我没有.我当然可以(当然也会).我或许可以找到一些东西,但这都是猜测和反复试验!
"Everybody"告诉您,您应该只在测量/分析后进行优化,但在优化编译时,我们又回到了试验和错误状态?
注:建议从与评论"黑客" __TIME__也不能正常工作,至少不会在视觉-C++,因为(在文档状态):在最近的编译时间电流源文件.时间是hh:mm:ss形式的字符串文字. - 我想至少可以获得带有这个标记的单个编译单元的时间,但是它无助于向下钻取到编译单元.
#define B 100+B
main()
{
int i= B;
}
Run Code Online (Sandbox Code Playgroud)
我知道这是错的,但出于好奇,当我编译它时,我得到了这个奇怪的错误:
"B未在此范围内宣布".
为什么会这样?如果这个错误是因为编译器在替换后删除了宏,那么当B在A可用之前必须被删除时,下面的代码是如何工作的呢?
#define B 100
#define A 100+B
main()
{
int i= B;
int j =A;
}
Run Code Online (Sandbox Code Playgroud) c ×5
c++ ×4
gcc ×2
visual-c++ ×2
addressof ×1
build-time ×1
c++-faq ×1
indirection ×1
linker ×1
macros ×1
profiling ×1
standards ×1