相关疑难解决方法(0)

编译/链接过程如何工作?

编译和链接过程如何工作?

(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)

c++ compiler-construction linker c++-faq

395
推荐指数
6
解决办法
19万
查看次数

这个1988 C代码有什么问题?

我正在尝试编写"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)

c

95
推荐指数
7
解决办法
7643
查看次数

如何在#define之类的宏扩展后运行GCC预处理器来获取代码?

是否有一个选项,GCC预处理器可以生成C源代码并过滤掉不相关的源代码?

例如,一个.c文件有一个#define开关来定义许多不同的平台.我只对一个平台感兴趣,我希望C预处理器过滤掉不相关的代码.

GCC是否支持这一点?

gcc

25
推荐指数
3
解决办法
2万
查看次数

C预处理器是否删除了"&*"的实例?

我正在玩,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.

我的猜测是预处理器剥离出来的情况下,&**&之前,他们甚至得到了编译器,因为他们否定对方,但我无法找到任何文件,以验证这是否是标准ç或编译器特定的.

被预处理器剥离出来&*,并*&和我可以期待从任何给定的编译器这种行为?

c standards addressof indirection c-preprocessor

25
推荐指数
2
解决办法
1208
查看次数

如何查看Visual C++预处理器的输出?

我希望在我的代码上看到Visual C++预处理器的输出 - 即相当于gcc -E.对于我的生活,我找不到相关的编译器开关.我该如何做到这一点?

c++ visual-c++ c-preprocessor

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

仅运行预处理器,但仅用于某些语句

我在程序中定义了许多调试语句,我希望能够在没有这些语句的情况下复制源代码.

为了做到这一点,我首先看了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是否缺少指令,或者是否有能够执行此操作的工具?

c gcc c-preprocessor

14
推荐指数
2
解决办法
6029
查看次数

C++的在线预处理器

我有:

  1. 具有大量复杂MACROS的C++代码(#define bla bla ...)
  2. 以及那些MACROS的用法(实例化)

我需要:

一个工具(例如在线),它将简单地进行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)

c++ c-preprocessor

12
推荐指数
1
解决办法
8327
查看次数

如何找出编译器花费时间的位置?

如何找出编译器花费时间的位置?

我的构建速度太慢,我已经在使用RAMdisk作为VC++临时文件,它没有任何区别.(我有一个SSD,所以我预计没有区别.)

这个项目中的大多数单个C++文件都需要大约.编译2秒似乎很糟糕(因为我也没有任何项目内并行化,因为我使用的是VS2005).

我该如何优化呢?不进行分析就不优化,但如何分析编译器?

注意:这些并不是真的有用:


让我们添加一个好评:你有很多模板吗?你的文件平均有多大?你检查过,只包括最少的必要标题

不,我没有.我当然可以(当然也会).我或许可以找到一些东西,但这都是猜测反复试验!

"Everybody"告诉您,您应该只在测量/分析后进行优化,但在优化编译时,我们又回到了试验和错误状态?


注:建议从与评论"黑客" __TIME__不能正常工作,至少不会在视觉-C++,因为(在文档状态):最近的编译时间电流源文件.时间是hh:mm:ss形式的字符串文字. - 我想至少可以获得带有这个标记的单个编译单元的时间,但是它无助于向下钻取到编译单元.

c++ compiler-construction profiling build-time visual-c++

12
推荐指数
1
解决办法
372
查看次数

预处理器宏如何工作?

#define B 100+B
main()
{
    int i= B;
}
Run Code Online (Sandbox Code Playgroud)

我知道这是错的,但出于好奇,当我编译它时,我得到了这个奇怪的错误:

"B未在此范围内宣布".

为什么会这样?如果这个错误是因为编译器在替换后删除了宏,那么当BA可用之前必须被删除时,下面的代码是如何工作呢?

#define B 100
#define A 100+B
main()
{
    int i= B;
    int j =A;
}
Run Code Online (Sandbox Code Playgroud)

c macros c-preprocessor

6
推荐指数
2
解决办法
1773
查看次数

了解预处理器正在做什么

无论如何,在预处理器完成所有替换之后,还能看到代码的样子吗?

c c-preprocessor

5
推荐指数
3
解决办法
1700
查看次数