我们有一个遗留数据库模式,有一些有趣的设计决策.直到最近,我们才支持Oracle和SQL Server,但我们正在尝试添加对PostgreSQL的支持,这引发了一个有趣的问题.我搜索了Stack Overflow和其他互联网,我不相信这种特殊情况是重复的.
对于唯一约束中的可空列,Oracle和SQL Server的行为都相同,这实际上是在执行唯一检查时忽略NULL列.
假设我有以下表格和约束:
CREATE TABLE EXAMPLE
(
ID TEXT NOT NULL PRIMARY KEY,
FIELD1 TEXT NULL,
FIELD2 TEXT NULL,
FIELD3 TEXT NULL,
FIELD4 TEXT NULL,
FIELD5 TEXT NULL,
...
);
CREATE UNIQUE INDEX EXAMPLE_INDEX ON EXAMPLE
(
FIELD1 ASC,
FIELD2 ASC,
FIELD3 ASC,
FIELD4 ASC,
FIELD5 ASC
);
Run Code Online (Sandbox Code Playgroud)
在Oracle和SQL Server上,保留任何可为空的列NULL
将导致仅对非空列执行唯一性检查.所以以下插入只能执行一次:
INSERT INTO EXAMPLE VALUES ('1','FIELD1_DATA', NULL, NULL, NULL, NULL );
INSERT INTO EXAMPLE VALUES ('2','FIELD1_DATA','FIELD2_DATA', NULL, NULL,'FIELD5_DATA');
-- These will succeed when they should violate …
Run Code Online (Sandbox Code Playgroud) 我的问题vsprintf
是我无法直接获取输入参数,我必须首先获取输入并将它们保存在void**
,然后传递void**
给vsprintf()
它,这对于windows来说都很好,但是当我来到64位linux时,gcc无法编译因为它不允许转换void**
为va_list
,是否有人可以给我一些帮助我应该如何在linux下执行此操作?
我可以在GCC中动态创建va_list吗?
void getInputArgs(char* str, char* format, ...)
{
va_list args;
va_start(args, format);
vsprintf(str, format, args);
va_end(args);
}
void process(void)
{
char s[256];
double tempValue;
char * tempString = NULL;
void ** args_ptr = NULL;
ArgFormatType format; //defined in the lib I used in the code
int numOfArgs = GetNumInputArgs(); // library func used in my code
if(numOfArgs>1)
{
args_ptr = (void**) malloc(sizeof(char)*(numOfArgs-1));
for(i=2; i<numOfArgs; i++)
{
format …
Run Code Online (Sandbox Code Playgroud) 我想要一个 Cmake 函数来将一些二进制文件复制到特定位置。为此,我有以下函数定义:
function ( collect_binaries TARGET_NAME DEST_DIR )
set ( targetsToCopy ${ARGN} )
set ( copy_cmd "COMMAND ${CMAKE_COMMAND} -E make_directory ${DEST_DIR}\n" )
foreach ( target ${targetsToCopy} )
LIST( APPEND copy_cmd "COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${target}> ${DEST_DIR}$<TARGET_FILE_NAME:${target}>\n")
endforeach( target ${targetsToCopy} )
#message( FATAL_ERROR ${copy_cmd} )
add_custom_target( ${TARGET_NAME} )
add_custom_command( TARGET ${TARGET_NAME} PRE_BUILD ${copy_cmd} )
endfunction( collect_binaries )
Run Code Online (Sandbox Code Playgroud)
以及以下用法:
collect_binaries( bin_copy ${PROJECT_BINARY_DIR}/out/ target_1 target_2 target3 )
Run Code Online (Sandbox Code Playgroud)
我在项目树中定义了 target_1、target_2 和 target_3。考虑到这一点,我得到了以下 Cmake 配置输出:
binary_copy.cmake:15 (add_custom_command) 处的 CMake 警告 (dev):
策略 CMP0040 未设置:add_custom_command() …
C++ 17为一些emplace_back()
类型的函数引入了一个新的函数签名(std::optional<>
也有一个),但它们不是ref-qualified.这允许emplace_back()
在临时和绑定到左值引用上调用,即使未扩展对象的生命周期.考虑以下:
#include <vector>
#include <optional>
#include <iostream>
struct A {
A(int i) : i(i) { std::cout << "constructor called: " << i << '\n'; }
~A() { std::cout << "destructor called\n"; }
int i;
};
int main() {
auto & a = std::optional<A>().emplace(5);
std::cout << "a: " << a.i << '\n';
auto & v = std::vector<A>().emplace_back(5);
std::cout << "v: " << v.i << '\n';
// This fails to compile, because value() *is*
// …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个小型编译器。现在我有一个层次系统来表达抽象语法树(AST)。
class Ast{
public:
// ...
}
class Expr : public Ast{
public:
// ...
}
using ExprNode = shared_ptr<Expr>;
class BinaryOp : public Expr{
public:
ExprNode lhs;
ExprNode rhs;
}
Run Code Online (Sandbox Code Playgroud)
Ast
层次系统中的所有类都使用 shared_ptr 来管理它们的成员(如果需要),例如,BinaryOp
持有两个成员来表示其操作数。
我想在树上应用访问者模式来为 AST 生成 IR 代码。我的问题是,访问者应该接受原始指针作为参数,还是接受 shared_ptr 作为参数,这可能会导入shared_from_this
(考虑利弊)?如果需要 shared_ptr,我应该使用按值传递还是按引用传递?
class AstVisitor{
public:
virtual Ast* visit(Ast* ast);
virtual Ast* visitBinaryOp(BinaryOp* binary){
visit(binary->lhs.get());
visit(binary->rhs.get());
// ...
}
}
class Ast{
public:
virtual Ast* accept(AstVisitor& visitor);
}
class BinaryOp:{
public:
virtual Ast* accept(AstVisitor& visitor) …
Run Code Online (Sandbox Code Playgroud)