我有一个 C 项目的复杂目录结构,其中 CMAKE 控制某个项目使用哪些文件。
我尝试使用 VS Code 的 CMake 扩展,但效果不太好。
有没有办法告诉 VS Code 到底使用了哪些文件以便能够在代码中导航?
类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) 我对 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)
如果是,为什么有人会选择后一种声明?有没有建议我应该使用这两种变体中的哪一种?我问这个是因为我通常在示例中看到后一个声明,我无法解释为什么有人更喜欢第二个声明而不是第一个声明。
我知道根据标准,fun(++a, a)应该避免,因为第二个参数没有明确定义。
然而,这种配方安全吗:
(++a ? a : 10);
Run Code Online (Sandbox Code Playgroud)
我测试了这个代码片段,它按预期工作,即a = -1它的计算结果为,而对于10任何其他代码段,a它的计算结果为a+1。这是标准中明确定义的,还是很大程度上取决于编译器?
是否有可能在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.
我正在为微控制器编写一些库,为此,我使用类似宏的函数.例如,启用I2C模块的类似宏的函数定义为:
#define I2C_MODULE_ENABLE(_x) \
I2C##_x##CONLbits.I2CEN = 1
Run Code Online (Sandbox Code Playgroud)
_x模块编号在哪里(例如,1或2在我的情况下).
如果用户将此宏调用函数称为I2C_MODULE_ENABLE(1),则它将由预处理器扩展为I2C1CONLbits. I2CEN = 1.
但是,如果用户将这个类似宏的函数称为I2C_MODULE_ENABLE(MY_I2C),其中MY_I2C是config.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,我的编译器抱怨它们之间的空格I2C1和CONLbits令牌.
我有一个(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)
我怎样才能做到这一点?
c ×4
cmake ×2
macros ×2
conditional ×1
ebnf ×1
enums ×1
fpga ×1
header-files ×1
libraries ×1
new-operator ×1
overriding ×1
project ×1
python ×1
standards ×1
syntax ×1
typeerror ×1
vhdl ×1