小编use*_*597的帖子

如何在VC++项目中强制执行其他包含文件搜索顺序?

例如,我有两个header.h文件位于两个不同的目录include1include2.我的源代码文件使用不指定确切位置的常规包含,如下所示:

#include "header.h"
Run Code Online (Sandbox Code Playgroud)

在项目配置中,我将include1include2文件夹设置为其他包含目录列表.

问题是当我构建我的项目时,每次都会选择include1文件夹,而不管我在附加包含列表中定义它们的顺序.

有没有办法强制执行搜索顺序,如果我想要一个特定的文件夹或特定的头文件,而不是另一个,如果他们都有相同的文件名?

c c++ visual-studio

8
推荐指数
1
解决办法
906
查看次数

忽略或重新定义GCC标准预定义宏

是否可以告诉GCC编译源代码,而忽略了像宏__FILE__,__LINE__等,等,或重新定义它们扩展到让我们说-一个空字符串?

c flags gcc compilation c-preprocessor

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

在x64 Visual Studio中内联汇编函数

我知道x64模式下的MSVC编译器不支持内联汇编代码片段,并且为了使用汇编代码,你必须在一些外部my_asm_funcs.asm文件中定义你的函数,如下所示:

my_asm_func PROC
    mov rax, rcx
    ret
my_asm_func ENDP
Run Code Online (Sandbox Code Playgroud)

然后在你的.c或.h文件中为这个函数定义一个标题:

int my_asm_func(int x);
Run Code Online (Sandbox Code Playgroud)

虽然该解决方案解决了许多问题,但我仍然有兴趣使汇编代码函数内联,换句话说 - 在编译之后我不想对my_asm_func进行任何"调用" ,我只是希望这个程序集被粘合进入我的最终编译代码.我尝试使用inline__forceinline关键字声明该函数,但似乎没有任何帮助.还有什么办法可以做我想要的吗?

c x86-64 masm visual-studio

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

在 C 中实现线程屏障和屏障重置的正确方法是什么?

我尝试在代码中实现一个简单的屏障,如下所示:

void waitOnBarrier(int* barrier, int numberOfThreads) {
    atomicIncrement(barrier); // atomic increment implemented in assembly
    while(*barrier < numberOfThreads);
}
Run Code Online (Sandbox Code Playgroud)

然后代码中有一个屏障的用法:

int g_barrier = 0; // a global variable

waitOnBarrier(&g_barrier, someKnownNumberOfThreads);
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利,但是我应该在哪里将g_barrier变量重置为零?如果我写类似的东西

g_barrier = 0;
Run Code Online (Sandbox Code Playgroud)

在waitOnBarrier调用之后,如果其中一个线程比其他线程更快地从屏障中释放并使 g_barrier 无效,所有其他线程仍在执行循环指令,那么我将遇到一个问题,所以最终它们将永远卡在屏障上。

说明: waitOnBarrier将编译成如下内容(伪代码):

1: mov rax, numberOfThreads
2: mov rbx, [barrier]
3: cmp rax, rbx
4: jmp(if smaller) to 2
Run Code Online (Sandbox Code Playgroud)

因此,如果我们有 2 个线程在屏障上同步,并且thread_1在指令 3 或 4 处速度较慢,而更快的thread_2到达屏障,则通过它并继续进入g_barrier无效流程。这意味着在thread_1到达指令 2 后,它将在 [barrier] 处看到一个零值,并且将永远卡在屏障上! …

c x86 multithreading barrier

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

Smalltalk/Squeak消息处理方法

一个非常简短的问题 - 如何命名消息处理方法(在消息传递时调用的第一个方法),以及在哪个类中定义它?

smalltalk class squeak messages

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

Clang 9/GCC 汇编器中的 x86 远返回助记符?

我正在尝试在使用 Clang 9 编译的 .S 文件中编写一段 x86 汇编代码。我需要在代码中使用“far return imm16”指令,我尝试使用带或不带立即操作数的“retf” ,但编译器无法识别它并给我“ error: invalid instruction mnemonic 'retf'”。它只识别“ret”和“retn”。

我究竟做错了什么?我需要使用的正确助记符是什么?

x86 assembly gcc clang att

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