显然,让编译器遇到该@字符会导致语法错误(除非它是注释或字符串文字).但是,如果在#if 0块中找到该字符,那么该程序在技术上是否有效?
我试过这个:
#define NOTHING(x)
int main()
{
NOTHING(@@@@);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
与-pedantic -Wall -Wextra上GCC和铛,它给了没有任何警告.我不确定这是否有效,或者他们是否只是没有特定的警告.
我没有在标准中找到任何说法,但这令人担忧.我不想在此基础上找到一个工具,只是为了找出符合标准的编译器对它进行扼流.
我有一个自定义工具,我希望在预处理和编译之间作为编译过程的一部分运行.对于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"是无效的答案,对不起.
相关(但没有解决速度问题)
有没有办法获取windbg当前使用的pdb文件的路径?通过本机命令,或者最好使用插件 API。
因此,理想情况下,我希望能够执行以下操作:
printf(getSymbolFile("ntdll.dll"));
Run Code Online (Sandbox Code Playgroud)
这将打印“c:\symbols\ntdll.pdb”
背景:我在 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 上有这样的可能吗?