gcc是否完全符合C99标准中规定的内联模型?
我已经浏览了一些关于这个问题的信息.但我无法理解为什么必须使用"extern"或"static"指定内联函数.
在.c文件中,调用在同一转换单元中定义的内联函数会导致错误.编译器行为的原因是什么?
我发现一个帖子是"内联"而没有"静态"或"外部"在C99中有用吗?
这是什么意思?
如果在内联定义可见的情况下调用某些具有外部链接的函数func,则行为与调用另一个函数(例如__func,具有内部链接)的行为相同.
我在使用 Spring(boot) Kafka 的微服务中有一个消费-转换-生产工作流程。我需要实现 Kafka 事务提供的一次性语义。下面是代码片段:
配置
@Bean
public ProducerFactory<String, String> producerFactory() {
Map<String, Object> props = new HashMap<>();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true);
props.put(ProducerConfig.MAX_REQUEST_SIZE_CONFIG, 1024 * 1024);
DefaultKafkaProducerFactory<String, String> defaultKafkaProducerFactory = new DefaultKafkaProducerFactory<>(props);
defaultKafkaProducerFactory.setTransactionIdPrefix("kafka-trx-");
return defaultKafkaProducerFactory;
}
@Bean
public ConsumerFactory<String, String> consumerFactory() {
Map<String, Object> props = new HashMap<>();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, 5000);
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
props.put(ConsumerConfig.ISOLATION_LEVEL_CONFIG, "read_committed");
return new DefaultKafkaConsumerFactory<>(props);
}
@Bean
public KafkaTemplate<String, String> kafkaTemplate() {
return new KafkaTemplate<>(producerFactory()); …Run Code Online (Sandbox Code Playgroud) 这是代码:
#include <stdio.h>
#include <stdio.h>
#define VAL1(a,b) a*b
#define VAL2(a,b) a/b
#define VAL3(a,b) ++a%b
int main()
{
int a = 1;
int b = 2;
int c = 3;
int d = 3;
int e = 5;
int result = VAL2(a,d)/VAL1(e,b)+VAL3(c,d); // result = 1
//int result = a/d/e*b+++c%d; // result = 0
printf("%d\n", result);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么两个陈述的结果不一样?
TEST.CPP
#include <iostream>
void f()
{
std::cout<<"non-inline"<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
main.cpp中
#include <iostream>
using namespace std;
inline void f()
{
cout<<"inline"<<endl;
}
int main()
{
f();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在调试模式下,输出为:非内联.命令:g ++ [-g] -o main main.cpp test.cpp
在发布模式下,输出为:内联.命令:g ++ -O -o main main.cpp test.cpp
为什么?
Linux G ++ 4.7.3
在C99中,内联定义不提供函数的外部定义,因此我们可以通过在其他源文件中定义另一个函数来提供标识符的外部定义.
内联定义是否为C++中的函数提供了外部定义?
谢谢!!