小编Mar*_*lin的帖子

如何告诉 VS Code 在 CMake 项目中的何处查找头文件和源文件?

我有一个 C 项目的复杂目录结构,其中 CMAKE 控制某个项目使用哪些文件。

我尝试使用 VS Code 的 CMake 扩展,但效果不太好。

有没有办法告诉 VS Code 到底使用了哪些文件以便能够在代码中导航?

c project cmake visual-studio-code

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

覆盖扩展 Enum 的类的 __new__

Message扩展Enum以添加一些逻辑。两个重要的参数是详细级别和消息字符串,以及其他可选消息 ( *args)。另一个类MessageError是该类的一种特殊形式,Message其中详细级别始终为零,其他一切都相同。

下面的代码令人尖叫TypeError

类型错误:枚举。new () 需要 2 个位置参数,但已给出 3 个

from enum import Enum


class Message(Enum):
    verbose: int
    messages: list[str]

    def __new__(cls, verbose: int, message: str, *args):
        self = object.__new__(cls)
        self._value_ = message
        return self
    
    def __init__(self, verbose: int, message: str, *args):
        self.verbose = verbose
        self.messages = [self.value] + list(args)


class MessageError(Message):

    def __new__(cls, message: str):
        return super().__new__(cls, 0, message) # <- problem is here!

    def __init__(self, …
Run Code Online (Sandbox Code Playgroud)

python enums overriding typeerror new-operator

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

VHDL 中的实体语法

我对 VHDL 中实体的语法感到困惑。以下是EBN 表格中应如何声明实体的规则:

在此处输入图片说明

资料来源:Peter J. Ashenden,“VHDL 设计师指南”,第 3 版,Morgan Kaufmann,2008 年。

我感到困惑的是声明的结尾。据此,我不需要在最后包含实体标识符,一切都会一样。例如,下面的两个声明是一样的吗?

声明 1

entity identifier is
    ...
begin
    ...
end ;
Run Code Online (Sandbox Code Playgroud)

声明2

entity identifier is
    ...
begin
    ...
end entity identifier ;
Run Code Online (Sandbox Code Playgroud)

如果是,为什么有人会选择后一种声明?有没有建议我应该使用这两种变体中的哪一种?我问这个是因为我通常在示例中看到后一个声明,我无法解释为什么有人更喜欢第二个声明而不是第一个声明。

syntax fpga vhdl ebnf

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

C 中三元运算符的求值顺序

我知道根据标准,fun(++a, a)应该避免,因为第二个参数没有明确定义。

然而,这种配方安全吗:

(++a ? a : 10);
Run Code Online (Sandbox Code Playgroud)

我测试了这个代码片段,它按预期工作,a = -1它的计算结果为,而对于10任何其他代码段,a它的计算结果为a+1。这是标准中明确定义的,还是很大程度上取决于编译器?

c standards conditional-operator

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

C中的宏条件语句

是否有可能在C中的宏函数中实现宏条件。

#define fun(x)
#if x==0
    fun1;
#else
    fun2;
#endif

#define fun1 // do something here
#define fun2 // do something else here
Run Code Online (Sandbox Code Playgroud)

换句话说,预处理器根据参数值决定要使用哪个宏。

fun(0) // fun1 is "preprocessed"
fun(1) // fun2 is "preprocessed"
Run Code Online (Sandbox Code Playgroud)

我知道此示例不起作用,但我想知道是否可以使其以某种方式起作用?

M.

c macros conditional c-preprocessor

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

使用##进行宏常量连接

我正在为微控制器编写一些库,为此,我使用类似宏的函数.例如,启用I2C模块的类似宏的函数定义为:

#define I2C_MODULE_ENABLE(_x) \
    I2C##_x##CONLbits.I2CEN = 1
Run Code Online (Sandbox Code Playgroud)

_x模块编号在哪里(例如,12在我的情况下).

如果用户将此宏调用函数称为I2C_MODULE_ENABLE(1),则它将由预处理器扩展为I2C1CONLbits. I2CEN = 1.

但是,如果用户将这个类似宏的函数称为I2C_MODULE_ENABLE(MY_I2C),其中MY_I2Cconfig.h我的i2c.h库包含的用户定义文件中定义的宏常量(例如,宏常量定义为#define MY_I2C 1),则类宏函数将被扩展作为I2CMY_I2CCONLbits. I2CEN = 1.

我知道我需要MY_I2C在连接之前以某种方式评估宏常量,我可以通过添加另一个宏级别来做到这一点:

#define __I2CxCONLbits(_x) I2C##_x##CONLbits
#define I2C_MODULE_ENABLE(_x) \
    __I2CxCONLbits.I2CEN = 1
Run Code Online (Sandbox Code Playgroud)

我的问题是:是否有一个更优雅的解决方案,因为我有多个寄存器,如CONLbits寄存器.使用这种方法,我需要__I2CxREGISTER(_x)为每个寄存器定义一个特殊的宏.

我试着这样做:

#define __I2Cx(_x) I2C##_x
#define I2C_MODULE_ENABLE(_x) \
    __I2Cx(_x)##CONLbits.I2CEN = 1
Run Code Online (Sandbox Code Playgroud)

但是产生这样的输出:I2C1 CONLbits .I2CEN = 1,我的编译器抱怨它们之间的空格I2C1CONLbits令牌.

c macros header-files libraries

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

从 CMake 运行 PowerShell 或 Shell 脚本

我有一个(power)shell 脚本,可以生成项目中其他源文件中使用的版本文件。

如何“注册”此脚本以在构建时与 CMake 一起使用?这是我尝试过的:

function(version)
    set(SRC version.h)
    set(VERSION_CMD ${CMAKE_SOURCE_DIR}/fw_lib/version/version.ps1)
    ADD_CUSTOM_TARGET(version DEPENDS ${SRC})
    ADD_CUSTOM_COMMAND(
        OUTPUT ${SRC} COMMAND ${VERSION_CMD}
        ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR}
    )
endfunction(version)
Run Code Online (Sandbox Code Playgroud)

请注意,${CMAKE_SOURCE_DIR}${CMAKE_BINARY_DIR}是脚本的输入参数。

我收到以下错误:

process_begin: CreateProcess(....) failed.
make (e=193): Error 193
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

cmake

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