小编mti*_*nic的帖子

C源中是否允许@字符?

显然,让编译器遇到该@字符会导致语法错误(除非它是注释或字符串文字).但是,如果在#if 0块中找到该字符,那么该程序在技术上是否有效?

我试过这个:

#define NOTHING(x)

int main()
{
    NOTHING(@@@@);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

与-pedantic -Wall -Wextra上GCC和铛,它给了没有任何警告.我不确定这是否有效,或者他们是否只是没有特定的警告.

我没有在标准中找到任何说法,但这令人担忧.我不想在此基础上找到一个工具,只是为了找出符合标准的编译器对它进行扼流.

c c-preprocessor

7
推荐指数
1
解决办法
104
查看次数

stdin作为MSVC的输入文件

我有一个自定义工具,我希望在预处理和编译之间作为编译过程的一部分运行.对于GCC,我这样做:

gcc [options] -E source.c | mytool | gcc [options] -c source.o -xc -
Run Code Online (Sandbox Code Playgroud)

但是,我还没弄清楚如何为MSVC做类似的事情.目前我有

cl.exe [options] /EP source.c | mytool.exe > temp.c
cl.exe [options] /c temp.c
Run Code Online (Sandbox Code Playgroud)

这里的问题是,对于每个源文件(数千),我有一个额外的磁盘写/读周期.此外,当MSVC输出.i文件时,它们往往变得非常大.超过10MB大.因此,每个文件的10MB磁盘I/O堆积起来非常快.

所以,我的问题:

1)是否可以让cl.exe读取将stdin视为输入文件?

2)如果没有,是否可以创建一个可以读取的内存映射文件?

3)有更好的方法吗?

不,"获得SSD"和"不使用MSVC"是无效的答案,对不起.

相关(但没有解决速度问题)

c c++ visual-c++

6
推荐指数
1
解决办法
530
查看次数

从windbg获取.pdb文件路径

有没有办法获取windbg当前使用的pdb文件的路径?通过本机命令,或者最好使用插件 API。

因此,理想情况下,我希望能够执行以下操作:

printf(getSymbolFile("ntdll.dll"));
Run Code Online (Sandbox Code Playgroud)

这将打印“c:\symbols\ntdll.pdb”

windbg debug-symbols pdb-files

5
推荐指数
1
解决办法
2599
查看次数

MSVC 链接器等效于 --wrap

背景:我在 msvc9 上处理一些遗留系统,浮点到 int 转换存在问题。__ftol2_sse如果不为 SSE 编译,它会发出一条指令,该指令是未定义的引用。

抑制这种情况的唯一方法是使用/QIfist执行内联转换的选项,而不调用任何ftol(). 但是,这些内联转换具有不同的舍入算法,因此在与现有代码一起使用时会导致问题。那,他们向 cl.exe stderr 发出不可抑制的“已弃用”警告。

我的解决方法是:

// Declare a regular _ftol() function that is present.
long __cdecl _ftol(double); 
// Define _ftol2_sse() to be the regular one.
long __cdecl _ftol2_sse(double f) { return _ftol(f); }
Run Code Online (Sandbox Code Playgroud)

这很好用。但是,某些构建确实已_ftol2_sse定义,在这种情况下,我会得到多个定义,并且很难在代码中弄清楚这一点。


我希望做类似--wrap __ftol2_ssefrom 的事情ld,并覆盖所有构建的行为。在 MSVC 上有这样的可能吗?

c ld visual-c++-2008 visual-c++

5
推荐指数
0
解决办法
989
查看次数