c++ - 在头文件中定义变量不会出错
问题描述
我正在编写一些代码来测试不应在头文件中定义该变量。但是,没有任何错误。我就是想不通。
请告诉我为什么我运行时没有发生错误build.bat
。该变量在头文件中定义,该文件包含在两个源文件中。
CMake项目的结构是:
--build
--include
----module1.h
--script
----build.bat
--src
----Main.cpp
----module1.cpp
----CMakeLists.txt
--CMakeLists.txt
的内容include/module1.h
是:
int a = 1;
的内容src/module1.cpp
是:
#include "module1.h"
的内容src/Main.cpp
是:
#include "module1.h"
CMakeLists.txt
根目录下的内容为:
cmake_minimum_required(VERSION 3.0)
PROJECT(ProjectExample VERSION 0.1.0)
SET(CMAKE_CXX_STANDARD 11)
SET(CMAKE_CXX_FLAGS "-Wno-deprecated-declarations")
ENABLE_TESTING()
ADD_SUBDIRECTORY(src)
的内容src/CMakeLists.txt
是:
SET(INCLUDE ${CMAKE_SOURCE_DIR}/include)
FILE(GLOB SOURCE "*.cpp")
LIST(REMOVE_ITEM SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/Main.cpp)
ADD_COMPILE_OPTIONS("-g")
ADD_COMPILE_OPTIONS("-Wall")
ADD_LIBRARY(hello ${SOURCE})
TARGET_INCLUDE_DIRECTORIES(hello PUBLIC "${INCLUDE}")
ADD_EXECUTABLE(main ${CMAKE_CURRENT_SOURCE_DIR}/Main.cpp)
TARGET_LINK_LIBRARIES(main hello)
的内容script/build.bat
是:
@echo off
pushd .
if not exist build (
md build
)
cd build
cmake -G"MinGW Makefiles" ..
mingw32-make.exe
popd
解决方案
首先,忘记头文件。那是一种分心。本质上,问题在于有两个定义相同名称的源文件:
// file1.cpp
int a = 1;
// file2.cpp
int a = 1;
问题是,为什么编译和链接这段代码不会出错?
技术上的答案是,这样的重新定义违反了单一定义规则 (ODR),并且违反 ODR 不需要诊断。
在实践中,函数的重复定义会给出错误消息。数据的重复定义有时不会。
如果你幸运的话,当你运行它时,代码将会失败。如果你不走运,它会在你的整个测试过程中正常工作,当你向最重要的客户提供演示时它会崩溃。
推荐阅读
- google-bigquery - ST_GeogFromGeoJSON 在 bigquery 中失败,而在 postgres 中成功
- c++ - std::set::erase 意外擦除 3 个元素
- c++ - 搜索一个数字是否包含在 3x3 数组中的程序只找到最后一个数字
- visual-studio-code - 在 Visual Studio Code 中删除存储库
- html - 附加 iframe src
- python - 运行 WSGI 应用程序时出错 - client_secrets.json
- c# - 如何覆盖 InputBase
Blazor 中的值,用于验证 - android - 处理程序中延迟时间的目的
- bootstrap-4 - 引导程序中的图像高度
- javascript - 我想将输入中的文本存储在数组中并按字母顺序对其进行洗牌,怎么做?